From 2c86d804e005a62591fcc6a78c845d7a295aebcf Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Thu, 26 May 2022 19:40:45 +0800
Subject: [PATCH] add dapp login

---
 src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java                 |    2 
 src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java                     |   23 +
 src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java   |  235 +++++++-------
 src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java |   58 +++
 src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java          |   17 
 pom.xml                                                                   |    6 
 src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java        |  162 +++++-----
 src/main/java/cc/mrbird/febs/dapp/chain/EthService.java                   |   32 +
 /dev/null                                                                 |  133 --------
 src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java          |    5 
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java  |   40 ++
 src/main/java/cc/mrbird/febs/job/ChainListenerJob.java                    |    2 
 src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java     |    8 
 src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java  |   74 ++--
 src/main/java/cc/mrbird/febs/common/contants/AppContants.java             |    1 
 src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java              |    8 
 src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java     |   16 
 src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java      |   30 +
 18 files changed, 442 insertions(+), 410 deletions(-)

diff --git a/pom.xml b/pom.xml
index 7d0606b..231899c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -359,6 +359,12 @@
             <scope>system</scope>
             <systemPath>${basedir}/lib/huobi-client-1.0.8-SNAPSHOT.jar</systemPath>
         </dependency>
+
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpkix-jdk15on</artifactId>
+            <version>1.70</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java b/src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java
index 3c8c7a0..0d9a366 100644
--- a/src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java
+++ b/src/main/java/cc/mrbird/febs/common/aspect/SubmitRepeatAspect.java
@@ -1,81 +1,81 @@
-package cc.mrbird.febs.common.aspect;
-
-import cc.mrbird.febs.common.annotation.SubmitRepeat;
-import cc.mrbird.febs.common.contants.AppContants;
-import cc.mrbird.febs.common.exception.FebsException;
-import cc.mrbird.febs.common.utils.RedisUtils;
-import cc.mrbird.febs.modules.api.entity.MemberEntity;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.crypto.asymmetric.KeyType;
-import cn.hutool.crypto.asymmetric.RSA;
-import com.alibaba.fastjson.JSON;
-import lombok.extern.slf4j.Slf4j;
-import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.*;
-import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-
-@Slf4j
-@Aspect
-@Component
-public class SubmitRepeatAspect {
-
-    @Resource
-    private RedisUtils redisUtil;
-
-    private String key;
-
-    @Pointcut("@annotation(submitRepeat)")
-    public void submitRepeatPointCut(SubmitRepeat submitRepeat) {
-
-    }
-
-    @Before("submitRepeatPointCut(submitRepeat)")
-    public void before(SubmitRepeat submitRepeat) {
-    }
-
-    @Around("submitRepeatPointCut(submitRepeat)")
-    public Object around(ProceedingJoinPoint joinPoint, SubmitRepeat submitRepeat) throws Throwable {
-        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-        HttpServletRequest request = attributes.getRequest();
-
-        String headerToken = request.getHeader("token");
-        String token = resolveToken(headerToken);
-        if(StrUtil.isEmpty(token)) {
-        	throw new FebsException("系统繁忙");
-        }
-        String object = (String)redisUtil.get(token);
-        MemberEntity member = JSON.parseObject(object, MemberEntity.class);
-        String mId = member.getId().toString();
-        
-        String uri = request.getRequestURI();
-        log.info("#token : {}, uri : {}, mId : {}#", token, uri, mId);
-        key = mId + "_" + uri;
-        boolean flag = redisUtil.setNotExist(key, "1", 5);
-        log.info("#mid : {}, flag : {}#", mId, flag);
-        if (flag) {
-        	return joinPoint.proceed();
-        } else {
-        	throw new FebsException("请勿重复提交");
-        }
-    }
-
-    @After("submitRepeatPointCut(submitRepeat)")
-    public void after(SubmitRepeat submitRepeat) {
-
-    }
-
-    private static String resolveToken(String token) {
-        try {
-            RSA rsa = new RSA(AppContants.PRIVATE_KEY, null);
-            String[] tokens = StrUtil.split(rsa.decryptStr(token, KeyType.PrivateKey), "_");
-            return tokens[0];
-        } catch (Exception e) {
-            return null;
-        }
-    }
-}
+//package cc.mrbird.febs.common.aspect;
+//
+//import cc.mrbird.febs.common.annotation.SubmitRepeat;
+//import cc.mrbird.febs.common.contants.AppContants;
+//import cc.mrbird.febs.common.exception.FebsException;
+//import cc.mrbird.febs.common.utils.RedisUtils;
+////import cc.mrbird.febs.modules.api.entity.MemberEntity;
+//import cn.hutool.core.util.StrUtil;
+//import cn.hutool.crypto.asymmetric.KeyType;
+//import cn.hutool.crypto.asymmetric.RSA;
+//import com.alibaba.fastjson.JSON;
+//import lombok.extern.slf4j.Slf4j;
+//import org.aspectj.lang.ProceedingJoinPoint;
+//import org.aspectj.lang.annotation.*;
+//import org.springframework.stereotype.Component;
+//import org.springframework.web.context.request.RequestContextHolder;
+//import org.springframework.web.context.request.ServletRequestAttributes;
+//
+//import javax.annotation.Resource;
+//import javax.servlet.http.HttpServletRequest;
+//
+//@Slf4j
+//@Aspect
+//@Component
+//public class SubmitRepeatAspect {
+//
+//    @Resource
+//    private RedisUtils redisUtil;
+//
+//    private String key;
+//
+//    @Pointcut("@annotation(submitRepeat)")
+//    public void submitRepeatPointCut(SubmitRepeat submitRepeat) {
+//
+//    }
+//
+//    @Before("submitRepeatPointCut(submitRepeat)")
+//    public void before(SubmitRepeat submitRepeat) {
+//    }
+//
+//    @Around("submitRepeatPointCut(submitRepeat)")
+//    public Object around(ProceedingJoinPoint joinPoint, SubmitRepeat submitRepeat) throws Throwable {
+//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+//        HttpServletRequest request = attributes.getRequest();
+//
+//        String headerToken = request.getHeader("token");
+//        String token = resolveToken(headerToken);
+//        if(StrUtil.isEmpty(token)) {
+//        	throw new FebsException("系统繁忙");
+//        }
+//        String object = (String)redisUtil.get(token);
+//        MemberEntity member = JSON.parseObject(object, MemberEntity.class);
+//        String mId = member.getId().toString();
+//
+//        String uri = request.getRequestURI();
+//        log.info("#token : {}, uri : {}, mId : {}#", token, uri, mId);
+//        key = mId + "_" + uri;
+//        boolean flag = redisUtil.setNotExist(key, "1", 5);
+//        log.info("#mid : {}, flag : {}#", mId, flag);
+//        if (flag) {
+//        	return joinPoint.proceed();
+//        } else {
+//        	throw new FebsException("请勿重复提交");
+//        }
+//    }
+//
+//    @After("submitRepeatPointCut(submitRepeat)")
+//    public void after(SubmitRepeat submitRepeat) {
+//
+//    }
+//
+//    private static String resolveToken(String token) {
+//        try {
+//            RSA rsa = new RSA(AppContants.PRIVATE_KEY, null);
+//            String[] tokens = StrUtil.split(rsa.decryptStr(token, KeyType.PrivateKey), "_");
+//            return tokens[0];
+//        } catch (Exception e) {
+//            return null;
+//        }
+//    }
+//}
diff --git a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
index 888a4d8..6e7d01e 100644
--- a/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
+++ b/src/main/java/cc/mrbird/febs/common/contants/AppContants.java
@@ -101,4 +101,5 @@
 
     public static final String REDIS_KEY_ETH_NEW_PRICE = "ETH_NEW_PRICE";
     public static final String REDIS_KEY_CHANGE_FEE = "DAPP_CHANGE_FEE";
+    public static final String REDIS_KEY_SIGN = "LOGIN_SIGN";
 }
diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
index a997db1..2c4927e 100644
--- a/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
+++ b/src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
@@ -1,5 +1,6 @@
 package cc.mrbird.febs.common.interceptor;
 
+import cc.mrbird.febs.common.contants.AppContants;
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.SpringContextUtil;
@@ -8,12 +9,15 @@
 import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.servlet.HandlerInterceptor;
+import org.web3j.crypto.Hash;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.Map;
 
 /**
  * @author 
@@ -23,22 +27,40 @@
 public class DappInterceptor implements HandlerInterceptor {
 
     private final DappMemberDao dappMemberDao = SpringContextUtil.getBean(DappMemberDao.class);
+    private final RedisUtils redisUtils = SpringContextUtil.getBean(RedisUtils.class);
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         if ("OPTIONS".equals(request.getMethod().toUpperCase())) {
             return true;
         }
+        String headAddress = request.getHeader("address");
+        String key = request.getHeader("key");
+        String path = request.getServletPath().replace("/dapi", "");
+        log.info("进入拦截:{}, {}", headAddress, path);
 
-        String headAddress = request.getHeader("token");
         String chain = request.getHeader("chain");
-        log.info("进入拦截:{}", headAddress);
-        if (StrUtil.isBlank(headAddress)) {
+        if (StrUtil.isBlank(headAddress) || StrUtil.isBlank(key)) {
             responseUnAuth(response);
             return false;
         }
 
-        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress, chain);
+        Map<Object, Object> signKey = redisUtils.hmget(AppContants.REDIS_KEY_SIGN);
+        Object signObj = signKey.get(headAddress);
+
+        if (signObj == null) {
+            responseUnAuth(response);
+            return false;
+        }
+        String sign = (String) signObj;
+
+        String calKey = Hash.sha3(sign + path + headAddress).replace("0x", "");
+        if (!calKey.equals(key)) {
+            responseUnAuth(response);
+            return false;
+        }
+
+        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress, null);
         if (memberEntity == null) {
             responseUnAuth(response);
             return false;
diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
index 412fcf3..8ed6ab5 100644
--- a/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
+++ b/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
@@ -4,7 +4,7 @@
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.SpringContextUtil;
-import cc.mrbird.febs.modules.api.entity.MemberEntity;
+import cc.mrbird.febs.dapp.entity.DappMemberEntity;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.crypto.asymmetric.KeyType;
 import cn.hutool.crypto.asymmetric.RSA;
@@ -31,25 +31,19 @@
 
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        String headerToken = request.getHeader("token");
+        System.out.println(request.getHeader(":path"));
+        String headerToken = request.getHeader("key");
         if (StringUtils.isBlank(headerToken)) {
             responseUnAuth(response);
             return false;
         }
 
-        String token = resolveToken(headerToken);
-
-        if (token == null || AppContants.TIME_OUT.equals(token)) {
-            responseUnAuth(response);
-            return false;
-        }
-
-        String userJsonStr = redisUtils.getString(token);
+        String userJsonStr = redisUtils.getString(headerToken);
         if (StringUtils.isBlank(userJsonStr)) {
             responseUnAuth(response);
             return false;
         }
-        MemberEntity member = JSON.parseObject(userJsonStr, MemberEntity.class);
+        DappMemberEntity member = JSON.parseObject(userJsonStr, DappMemberEntity.class);
 
         request.getSession().setAttribute("member", member);
         return true;
diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java
index d4de897..e3df1c7 100644
--- a/src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java
+++ b/src/main/java/cc/mrbird/febs/common/interceptor/MybatisInterceptor.java
@@ -1,118 +1,117 @@
-package cc.mrbird.febs.common.interceptor;
-
-import cc.mrbird.febs.common.entity.BaseEntity;
-import cc.mrbird.febs.modules.api.entity.MemberEntity;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.ibatis.executor.Executor;
-import org.apache.ibatis.mapping.MappedStatement;
-import org.apache.ibatis.mapping.SqlCommandType;
-import org.apache.ibatis.plugin.*;
-import org.apache.ibatis.session.defaults.DefaultSqlSession;
-import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-/**
- * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间
- *
- * @author xxx
- * @date 2020-05-13
- **/
-@Slf4j
-//@Component
-//@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
-public class MybatisInterceptor implements Interceptor {
-    @Override
-    public Object intercept(Invocation invocation) throws Throwable {
-        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
-        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
-
-        Object parameter = invocation.getArgs()[1];
-        if (parameter == null) {
-            return invocation.proceed();
-        }
-
-        if (SqlCommandType.INSERT == sqlCommandType) {
-            if (parameter instanceof DefaultSqlSession.StrictMap) {
-                Map map = (Map) parameter;
-                List list = (List) map.get("list");
-                for (Object o : list) {
-                    injectForInsert(o);
-                }
-            } else {
-                injectForInsert(parameter);
-            }
-        }
-
-        if (SqlCommandType.UPDATE == sqlCommandType) {
-            if (parameter instanceof DefaultSqlSession.StrictMap) {
-                Map map = (Map) parameter;
-                List list = (List) map.get("list");
-                for (Object o : list) {
-                    injectForUpdate(o);
-                }
-            } else {
-                injectForUpdate(parameter);
-            }
-        }
-
-        return invocation.proceed();
-    }
-
-    @Override
-    public Object plugin(Object o) {
-        return Plugin.wrap(o, this);
-    }
-
-    @Override
-    public void setProperties(Properties properties) {
-
-    }
-
-    public void injectForInsert(Object o) {
-        MemberEntity member = getLoginUser();
-        if (o instanceof BaseEntity) {
-            BaseEntity baseEntity = (BaseEntity) o;
-            if (member != null) {
-                String by = member.getPhone();
-                baseEntity.setCreateBy(by);
-                baseEntity.setUpdateBy(by);
-            } else {
-                baseEntity.setCreateBy("system");
-                baseEntity.setUpdateBy("system");
-            }
-            baseEntity.setCreateTime(new Date());
-            baseEntity.setUpdateTime(new Date());
-        }
-    }
-
-    public void injectForUpdate(Object o) {
-        MemberEntity member = getLoginUser();
-        if (o instanceof BaseEntity) {
-            BaseEntity baseEntity = (BaseEntity) o;
-            if (member != null) {
-                String by = member.getPhone();
-                baseEntity.setUpdateBy(by);
-            } else {
-                baseEntity.setUpdateBy("system");
-            }
-            baseEntity.setUpdateTime(new Date());
-        }
-    }
-
-    private MemberEntity getLoginUser() {
-        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
-        if (attributes == null) {
-            return null;
-        }
-
-        HttpServletRequest request = attributes.getRequest();
-        return (MemberEntity) request.getSession().getAttribute("member");
-    }
-}
+//package cc.mrbird.febs.common.interceptor;
+//
+//import cc.mrbird.febs.common.entity.BaseEntity;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.ibatis.executor.Executor;
+//import org.apache.ibatis.mapping.MappedStatement;
+//import org.apache.ibatis.mapping.SqlCommandType;
+//import org.apache.ibatis.plugin.*;
+//import org.apache.ibatis.session.defaults.DefaultSqlSession;
+//import org.springframework.stereotype.Component;
+//import org.springframework.web.context.request.RequestContextHolder;
+//import org.springframework.web.context.request.ServletRequestAttributes;
+//
+//import javax.servlet.http.HttpServletRequest;
+//import java.util.Date;
+//import java.util.List;
+//import java.util.Map;
+//import java.util.Properties;
+//
+///**
+// * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间
+// *
+// * @author xxx
+// * @date 2020-05-13
+// **/
+//@Slf4j
+////@Component
+////@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
+//public class MybatisInterceptor implements Interceptor {
+//    @Override
+//    public Object intercept(Invocation invocation) throws Throwable {
+//        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
+//        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
+//
+//        Object parameter = invocation.getArgs()[1];
+//        if (parameter == null) {
+//            return invocation.proceed();
+//        }
+//
+//        if (SqlCommandType.INSERT == sqlCommandType) {
+//            if (parameter instanceof DefaultSqlSession.StrictMap) {
+//                Map map = (Map) parameter;
+//                List list = (List) map.get("list");
+//                for (Object o : list) {
+//                    injectForInsert(o);
+//                }
+//            } else {
+//                injectForInsert(parameter);
+//            }
+//        }
+//
+//        if (SqlCommandType.UPDATE == sqlCommandType) {
+//            if (parameter instanceof DefaultSqlSession.StrictMap) {
+//                Map map = (Map) parameter;
+//                List list = (List) map.get("list");
+//                for (Object o : list) {
+//                    injectForUpdate(o);
+//                }
+//            } else {
+//                injectForUpdate(parameter);
+//            }
+//        }
+//
+//        return invocation.proceed();
+//    }
+//
+//    @Override
+//    public Object plugin(Object o) {
+//        return Plugin.wrap(o, this);
+//    }
+//
+//    @Override
+//    public void setProperties(Properties properties) {
+//
+//    }
+//
+//    public void injectForInsert(Object o) {
+//        MemberEntity member = getLoginUser();
+//        if (o instanceof BaseEntity) {
+//            BaseEntity baseEntity = (BaseEntity) o;
+//            if (member != null) {
+//                String by = member.getPhone();
+//                baseEntity.setCreateBy(by);
+//                baseEntity.setUpdateBy(by);
+//            } else {
+//                baseEntity.setCreateBy("system");
+//                baseEntity.setUpdateBy("system");
+//            }
+//            baseEntity.setCreateTime(new Date());
+//            baseEntity.setUpdateTime(new Date());
+//        }
+//    }
+//
+//    public void injectForUpdate(Object o) {
+//        MemberEntity member = getLoginUser();
+//        if (o instanceof BaseEntity) {
+//            BaseEntity baseEntity = (BaseEntity) o;
+//            if (member != null) {
+//                String by = member.getPhone();
+//                baseEntity.setUpdateBy(by);
+//            } else {
+//                baseEntity.setUpdateBy("system");
+//            }
+//            baseEntity.setUpdateTime(new Date());
+//        }
+//    }
+//
+//    private MemberEntity getLoginUser() {
+//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+//        if (attributes == null) {
+//            return null;
+//        }
+//
+//        HttpServletRequest request = attributes.getRequest();
+//        return (MemberEntity) request.getSession().getAttribute("member");
+//    }
+//}
diff --git a/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java b/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
index e65affa..d1dbba0 100644
--- a/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
+++ b/src/main/java/cc/mrbird/febs/common/utils/LoginUserUtil.java
@@ -3,6 +3,7 @@
 import cc.mrbird.febs.dapp.entity.DappMemberEntity;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
+import org.web3j.crypto.Hash;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -16,4 +17,11 @@
         HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
         return (DappMemberEntity) request.getSession().getAttribute("member");
     }
+
+    public static String getLoginKey(String address, String nonce, String sign) {
+        StringBuilder sb = new StringBuilder();
+        StringBuilder append = sb.append(address).append(":").append(nonce).append(":").append(sign);
+
+        return append.toString();
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
index 135f689..df323cf 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/ChainService.java
@@ -65,7 +65,7 @@
         switch (chainType) {
             case "ETH" :
                 return ETH;
-            case "BSC" :
+            case "BSC_USDT" :
                 return BSC;
             case "TRX" :
                 return TRX;
diff --git a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
index c616545..c3ef26a 100644
--- a/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/chain/EthService.java
@@ -4,7 +4,7 @@
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSONObject;
-import org.apache.commons.lang3.StringUtils;
+import org.bouncycastle.jcajce.provider.digest.SHA3;
 import org.web3j.abi.FunctionEncoder;
 import org.web3j.abi.FunctionReturnDecoder;
 import org.web3j.abi.TypeReference;
@@ -12,17 +12,12 @@
 import org.web3j.abi.datatypes.Function;
 import org.web3j.abi.datatypes.Type;
 import org.web3j.abi.datatypes.generated.Uint256;
-import org.web3j.crypto.Credentials;
-import org.web3j.crypto.RawTransaction;
-import org.web3j.crypto.TransactionEncoder;
+import org.web3j.crypto.*;
 import org.web3j.protocol.Web3j;
 import org.web3j.protocol.core.DefaultBlockParameterName;
 import org.web3j.protocol.core.Request;
 import org.web3j.protocol.core.methods.request.Transaction;
-import org.web3j.protocol.core.methods.response.EthBlockNumber;
-import org.web3j.protocol.core.methods.response.EthCall;
-import org.web3j.protocol.core.methods.response.EthGetTransactionCount;
-import org.web3j.protocol.core.methods.response.EthSendTransaction;
+import org.web3j.protocol.core.methods.response.*;
 import org.web3j.protocol.http.HttpService;
 import org.web3j.utils.Convert;
 import org.web3j.utils.Numeric;
@@ -31,6 +26,7 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.RoundingMode;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -63,10 +59,22 @@
     public static void main(String[] args) throws IOException {
         HttpService service = new HttpService("https://bsc-dataseed1.ninicoin.io");
         Web3j web3j = Web3j.build(service);
-        Request<?, EthBlockNumber> request = web3j.ethBlockNumber();
-        EthBlockNumber send = request.send();
-        BigInteger bigInteger = Numeric.decodeQuantity(send.getResult());
-        System.out.println("0x113d6d0");
+//        Request<?, EthBlockNumber> request = web3j.ethBlockNumber();
+//        EthBlockNumber send = request.send();
+//        BigInteger bigInteger = Numeric.decodeQuantity(send.getResult());
+//        System.out.println("0x113d6d0");
+
+        String s1 = Hash.sha3("0xf6b06a30196aa5e318232a3b61319eab0fd4a3bf_llE4");
+
+        System.out.println(s1);
+        String str = "0xc2cd497cbbbc8bd0eb00a1b7340af86eb8f40f4fd1ee8f8660831d3841cb84be306dd15ceda42acf5d1f1add31793f17d2123c8e321f855dc41e6f44318841e71b_" + s1;
+//        Web3Sha3 send = web3j.web3Sha3("0x0d694bf4095e1dd854f7ba365db340308c4b4e5c990df0cd2e91465dd080935b").send();
+
+        String s = Hash.sha3(str);
+        // 0x515415edb1d3ae67a97f995b71bd09feaed27319722e55c4817f88273679a9e2
+        // 0x64296f548bf487d8e1fa8548572d316ffab08f92fe7d4438e747e9948778f802
+        // 0xb3b7c4bb00a80a646ecb803139a4e81eb5857dad30b299520fbd30f6eeeafd81
+        System.out.println(s);
     }
 
     @Override
diff --git a/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java b/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
index f5e10d2..1c4613d 100644
--- a/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
+++ b/src/main/java/cc/mrbird/febs/dapp/controller/ApiCommonController.java
@@ -2,6 +2,7 @@
 
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.dapp.dto.ApproveDto;
+import cc.mrbird.febs.dapp.dto.ConnectDto;
 import cc.mrbird.febs.dapp.service.DappMemberService;
 import cc.mrbird.febs.dapp.service.DappSimulateDataService;
 import cc.mrbird.febs.dapp.service.DappSystemService;
@@ -41,6 +42,13 @@
 //        return new FebsResponse().success().message("获取成功").data(dappMemberService.isApprove(address, chain));
 //    }
 
+    @ApiOperation(value = "链接接口", notes = "链接接口")
+    @PostMapping(value = "/connect")
+    public FebsResponse connect(@RequestBody ConnectDto connectDto) {
+        dappMemberService.connect(connectDto);
+        return new FebsResponse().success();
+    }
+
     @ApiOperation(value = "头部数据", notes = "头部数据")
     @GetMapping(value = "/totalIncome")
     public FebsResponse totalIncome() {
diff --git a/src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java b/src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java
new file mode 100644
index 0000000..dc77af7
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/dapp/dto/ConnectDto.java
@@ -0,0 +1,23 @@
+package cc.mrbird.febs.dapp.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author wzy
+ * @date 2022-05-26
+ **/
+@Data
+@ApiModel(value = "ConnectDto", description = "连接参数接收类")
+public class ConnectDto {
+
+    @ApiModelProperty(value = "地址", example = "123")
+    private String address;
+
+    @ApiModelProperty(value ="随机字符串", example = "123")
+    private String nonce;
+
+    @ApiModelProperty(value = "签名", example = "123")
+    private String sign;
+}
diff --git a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
index ed70cd5..265d5f9 100644
--- a/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
+++ b/src/main/java/cc/mrbird/febs/dapp/entity/DappFundFlowEntity.java
@@ -22,17 +22,16 @@
     public DappFundFlowEntity() {}
 
     public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, Integer fee) {
+        new DappFundFlowEntity(memberId, amount, type, status, fee, null);
+    }
+
+    public DappFundFlowEntity(Long memberId, BigDecimal amount, Integer type, Integer status, Integer fee, String fromHash) {
         this.memberId = memberId;
         this.amount = amount;
         this.type = type;
         this.status = status;
         this.fee = fee;
-
-        this.setCreateBy("system");
-        this.setUpdateBy("system");
-        this.setCreateTime(new Date());
-        this.setUpdateTime(new Date());
-        this.setVersion(1);
+        this.fromHash = fromHash;
     }
 
     private Long memberId;
@@ -40,7 +39,7 @@
     private BigDecimal amount;
 
     /**
-     * 类型 1-兑换 2-提现 3-采矿
+     * 类型 1-买入 2-卖出 3-采矿
      */
     private Integer type;
 
@@ -53,4 +52,8 @@
     private String address;
 
     private Integer fee;
+
+    private String toHash;
+
+    private String fromHash;
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
index a9a2279..b29af8f 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/DappMemberService.java
@@ -2,6 +2,7 @@
 
 import cc.mrbird.febs.common.entity.QueryRequest;
 import cc.mrbird.febs.dapp.dto.ApproveDto;
+import cc.mrbird.febs.dapp.dto.ConnectDto;
 import cc.mrbird.febs.dapp.dto.PriceSettingDto;
 import cc.mrbird.febs.dapp.entity.DappMemberEntity;
 import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity;
@@ -13,6 +14,8 @@
 public interface DappMemberService extends IService<DappMemberEntity> {
 
     void approve(ApproveDto approveDto);
+
+    void connect(ConnectDto connectDto);
 
     int isApprove(String address, String chain);
 
@@ -31,4 +34,6 @@
     IPage<DappTransferRecordEntity> selectTransferInPage(DappTransferRecordEntity transfer, QueryRequest request);
 
     void setNewestPrice(PriceSettingDto priceSettingDto);
+
+    DappMemberEntity insertMember(String address, String refererId);
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
index c8ba7de..bb60950 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscCoinContractEvent.java
@@ -5,24 +5,38 @@
 import cc.mrbird.febs.dapp.chain.ChainService;
 import cc.mrbird.febs.dapp.chain.ContractEventService;
 import cc.mrbird.febs.dapp.chain.EthUsdtContract;
+import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
 import cc.mrbird.febs.dapp.entity.DappMemberEntity;
+import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
 import cc.mrbird.febs.dapp.mapper.DappMemberDao;
+import cc.mrbird.febs.dapp.service.DappMemberService;
 import cn.hutool.core.util.StrUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.math.RoundingMode;
 
 @Service
 public class BscCoinContractEvent implements ContractEventService {
 
-    @Autowired
+    @Resource
     private DappMemberDao dappMemberDao;
+
+    @Resource
+    private DappMemberService dappMemberService;
+
+    @Resource
+    private DappFundFlowDao dappFundFlowDao;
 
     private final String ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25";
     int decimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void compile(EthUsdtContract.TransferEventResponse e) {
         if (e.to != null) {
@@ -30,61 +44,37 @@
                 return;
             }
 
-            DappMemberEntity fromMember = dappMemberDao.selectByAddress(e.from, null);
+            DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null);
             if (fromMember == null) {
-                fromMember = insertMember(e.from, null);
+                fromMember = dappMemberService.insertMember(e.from, null);
             }
 
             if (!e.to.equals(ADDRESS)) {
                 DappMemberEntity toMember = dappMemberDao.selectByAddress(e.to, null);
                 if (toMember == null) {
-                    toMember = insertMember(e.to, fromMember.getInviteId());
+                    toMember = dappMemberService.insertMember(e.to, fromMember.getInviteId());
                 }
             }
 
+            //
             // 卖币
             if (e.to.equals(ADDRESS)) {
                 BigInteger tokens = e.tokens;
+
+                BigDecimal amount = BigDecimal.valueOf(tokens.intValue()).divide(BigDecimal.TEN.pow(4), decimals, RoundingMode.HALF_DOWN);
+
+                DappFundFlowEntity fundFlow = new DappFundFlowEntity(fromMember.getId(), amount, 2, null, null, e.log.getTransactionHash());
+                dappFundFlowDao.insert(fundFlow);
+
+                // TODO price
+                BigDecimal newPrice = BigDecimal.valueOf(1);
+
+                BigDecimal transferAmount = amount.multiply(newPrice);
+                String hash = ChainService.getInstance(ChainEnum.BSC_USDT.name()).transfer(e.from, transferAmount);
+                fundFlow.setToHash(hash);
+                dappFundFlowDao.updateById(fundFlow);
             }
 
         }
-    }
-
-    private DappMemberEntity insertMember(String address, String refererId) {
-        DappMemberEntity member = new DappMemberEntity();
-        member.setAddress(address);
-
-        dappMemberDao.insert(member);
-
-        member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));
-        member.setRefererId(refererId);
-        if (StrUtil.isNotBlank(refererId)){
-            boolean flag = false;
-            String parentId = refererId;
-            String ids = "";
-            while (!flag && StringUtils.isNotBlank(parentId)) {
-                if (StrUtil.isBlank(ids)) {
-                    ids += parentId;
-                } else {
-                    ids += ("," + parentId);
-                }
-
-                DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId);
-                if (parentMember == null) {
-                    break;
-                }
-                parentId = parentMember.getRefererId();
-                if(StringUtils.isBlank(parentId)){
-                    break;
-                }
-                if (parentMember.getRefererId().equals(parentMember.getInviteId())) {
-                    flag = true;
-                }
-            }
-            member.setRefererIds(ids);
-        }
-        dappMemberDao.updateById(member);
-
-        return member;
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
index 79f1205..385c076 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/BscUsdtContractEvent.java
@@ -1,22 +1,62 @@
 package cc.mrbird.febs.dapp.service.impl;
 
 import cc.mrbird.febs.common.utils.ShareCodeUtil;
+import cc.mrbird.febs.dapp.chain.ChainEnum;
+import cc.mrbird.febs.dapp.chain.ChainService;
 import cc.mrbird.febs.dapp.chain.ContractEventService;
 import cc.mrbird.febs.dapp.chain.EthUsdtContract;
+import cc.mrbird.febs.dapp.entity.DappFundFlowEntity;
 import cc.mrbird.febs.dapp.entity.DappMemberEntity;
+import cc.mrbird.febs.dapp.mapper.DappFundFlowDao;
 import cc.mrbird.febs.dapp.mapper.DappMemberDao;
+import cc.mrbird.febs.dapp.service.DappMemberService;
 import cn.hutool.core.util.StrUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+
 @Slf4j
 @Service
 public class BscUsdtContractEvent implements ContractEventService {
 
+    @Resource
+    private DappMemberService dappMemberService;
+
+    @Resource
+    private DappFundFlowDao dappFundFlowDao;
+
+    private final String ADDRESS = "0x977a9ddfb965a9a3416fa72ca7f91c4949c18f25";
+    int decimals = ChainService.getInstance(ChainEnum.BSC_USDT.name()).decimals();
+    int tfcDecimals = ChainService.getInstance(ChainEnum.BSC_TFC.name()).decimals();
+
     @Override
     public void compile(EthUsdtContract.TransferEventResponse e) {
+        if (e.to != null && ADDRESS.equals(e.from)) {
+            DappMemberEntity fromMember = dappMemberService.findByAddress(e.from, null);
+            if (fromMember == null) {
+                fromMember = dappMemberService.insertMember(e.from, null);
+            }
 
+            BigInteger tokens = e.tokens;
+
+            BigDecimal amount = BigDecimal.valueOf(tokens.intValue()).divide(BigDecimal.TEN.pow(decimals), decimals, RoundingMode.HALF_DOWN);
+
+            DappFundFlowEntity fundFlow = new DappFundFlowEntity(fromMember.getId(), amount, 2, null, null, e.log.getTransactionHash());
+            dappFundFlowDao.insert(fundFlow);
+
+            // TODO price
+            BigDecimal newPrice = BigDecimal.valueOf(1);
+
+            BigDecimal transferAmount = amount.multiply(newPrice);
+            String hash = ChainService.getInstance(ChainEnum.BSC_TFC.name()).transfer(e.from, transferAmount);
+            fundFlow.setToHash(hash);
+            dappFundFlowDao.updateById(fundFlow);
+        }
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
index 6acec79..6efb1dc 100644
--- a/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/dapp/service/impl/DappMemberServiceImpl.java
@@ -4,11 +4,13 @@
 import cc.mrbird.febs.common.entity.QueryRequest;
 import cc.mrbird.febs.common.exception.FebsException;
 import cc.mrbird.febs.common.utils.FebsUtil;
+import cc.mrbird.febs.common.utils.LoginUserUtil;
 import cc.mrbird.febs.common.utils.RedisUtils;
 import cc.mrbird.febs.common.utils.ShareCodeUtil;
 import cc.mrbird.febs.dapp.chain.ChainService;
 import cc.mrbird.febs.dapp.chain.ContractChainService;
 import cc.mrbird.febs.dapp.dto.ApproveDto;
+import cc.mrbird.febs.dapp.dto.ConnectDto;
 import cc.mrbird.febs.dapp.dto.PriceSettingDto;
 import cc.mrbird.febs.dapp.entity.DappMemberEntity;
 import cc.mrbird.febs.dapp.entity.DappTransferRecordEntity;
@@ -31,6 +33,7 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -114,6 +117,22 @@
         walletCoin.setAvailableAmount(BigDecimal.ZERO);
         walletCoin.setFrozenAmount(BigDecimal.ZERO);
         dappWalletCoinDao.insert(walletCoin);
+    }
+
+    @Override
+    public void connect(ConnectDto connectDto) {
+        DappMemberEntity member = dappMemberDao.selectByAddress(connectDto.getAddress(), null);
+
+        if (member == null) {
+            member = insertMember(connectDto.getAddress(), null);
+        }
+
+        String key = LoginUserUtil.getLoginKey(connectDto.getAddress(), connectDto.getNonce(), connectDto.getSign());
+        redisUtils.set(connectDto.getAddress(), member);
+
+        HashMap<String, String> map = new HashMap<>();
+        map.put(connectDto.getAddress(), key);
+        redisUtils.set(AppContants.REDIS_KEY_SIGN, map);
     }
 
     @Override
@@ -232,4 +251,43 @@
             redisUtils.set(AppContants.REDIS_KEY_ETH_NEW_PRICE, priceSettingDto.getNewestPrice());
         }
     }
+
+    @Override
+    public DappMemberEntity insertMember(String address, String refererId) {
+        DappMemberEntity member = new DappMemberEntity();
+        member.setAddress(address);
+
+        dappMemberDao.insert(member);
+
+        member.setInviteId(ShareCodeUtil.toSerialCode(member.getId()));
+        member.setRefererId(refererId);
+        if (StrUtil.isNotBlank(refererId)){
+            boolean flag = false;
+            String parentId = refererId;
+            String ids = "";
+            while (!flag && StringUtils.isNotBlank(parentId)) {
+                if (StrUtil.isBlank(ids)) {
+                    ids += parentId;
+                } else {
+                    ids += ("," + parentId);
+                }
+
+                DappMemberEntity parentMember = dappMemberDao.selectMemberInfoByInviteId(parentId);
+                if (parentMember == null) {
+                    break;
+                }
+                parentId = parentMember.getRefererId();
+                if(StringUtils.isBlank(parentId)){
+                    break;
+                }
+                if (parentMember.getRefererId().equals(parentMember.getInviteId())) {
+                    flag = true;
+                }
+            }
+            member.setRefererIds(ids);
+        }
+        dappMemberDao.updateById(member);
+
+        return member;
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
index dd75c34..6c64330 100644
--- a/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
+++ b/src/main/java/cc/mrbird/febs/job/ChainListenerJob.java
@@ -24,6 +24,6 @@
     public void chainListenerJob() {
         log.info("监听打开");
 //        ChainService.contractEventListener(new BigInteger("18097238"), bscUsdtContractEvent, ChainEnum.BSC_USDT.name());
-        ChainService.contractEventListener(new BigInteger("18097238"), bscCoinContractEvent, ChainEnum.BSC_TFC.name());
+//        ChainService.contractEventListener(new BigInteger("18097238"), bscCoinContractEvent, ChainEnum.BSC_TFC.name());
     }
 }
diff --git a/src/main/java/cc/mrbird/febs/modules/Test.java b/src/main/java/cc/mrbird/febs/modules/Test.java
deleted file mode 100644
index ec1b055..0000000
--- a/src/main/java/cc/mrbird/febs/modules/Test.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package cc.mrbird.febs.modules;
-
-/**
- * @author 
- * @date 2020-09-23
- **/
-public class Test {
-}
diff --git a/src/main/java/cc/mrbird/febs/modules/api/entity/MemberEntity.java b/src/main/java/cc/mrbird/febs/modules/api/entity/MemberEntity.java
deleted file mode 100644
index 3c7f19b..0000000
--- a/src/main/java/cc/mrbird/febs/modules/api/entity/MemberEntity.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package cc.mrbird.febs.modules.api.entity;
-
-import cc.mrbird.febs.common.entity.BaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-
-import java.math.BigDecimal;
-
-@Data
-@TableName("member")
-public class MemberEntity extends BaseEntity {
-
-    /**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	
-	/**
-     * 系统推荐人id
-     */
-    public static final String SYSTEM_REFERER = "rxadr3";
-
-	/**
-     * 账号状态 - 禁用
-     */
-    public static final Integer ACCOUNT_STATUS_DISABLED = 0;
-
-    /**
-     * 账号状态 - 启用
-     */
-    public static final Integer ACCOUNT_STATUS_ENABLE = 1;
-
-    /**
-     * 账号代理级别
-     */
-    public static final Integer ACCOUNT_AGENT_LEVEL = 6;
-
-    /**
-     * 账号类型 手机
-     */
-    public static final Integer ACCOUNT_TYPE_PHONE = 1;
-
-    /**
-     * 正常账号
-     */
-    public static final Integer ACCOUNT_TYPE_NORMAL = 1;
-    /**
-     * 测试账号
-     */
-    public static final Integer ACCOUNT_TYPE_TEST = 2;
-
-    /**
-     * 实名认证 审核通过
-     */
-    public static final Integer CERTIFY_STATUS_Y = 2;
-    /**
-     * 实名认证 审核不通过
-     */
-    public static final Integer CERTIFY_STATUS_N = 0;
-    /**
-     * 实名认证 审核中
-     */
-    public static final Integer CERTIFY_STATUS_ING = 1;
-    /**
-     * 实名认证 未提交
-     */
-    public static final Integer CERTIFY_STATUS_UN_SUBMIT = 3;
-
-    /**
-     * 昵称
-     */
-    private String nickname;
-    /**
-     * 手机号(包含国际手机号)
-     */
-    private String phone;
-
-    /**
-     * 登陆密码
-     */
-    private String password;
-
-    /**
-     * 交易密码
-     */
-    private String tradePassword;
-
-    /**
-     * 邀请码
-     */
-    private String inviteId;
-
-    /**
-     * 账号状态 0-禁用 1-启用
-     */
-    private Integer accountStatus;
-
-    /**
-     * 上级推荐人id
-     */
-    private String refererId;
-
-    /**
-     * 上级推荐人ID链
-     */
-    private String refererIds;
-
-    /**
-     * 账号类型 1-正常账号 2-测试账号
-     */
-    private Integer accountType;
-
-    /**
-     * 代理级别
-     */
-    private Integer agentLevel;
-
-    /**
-     * 实名认证状态 0-审核未通过 1-审核通过 2-等待审核
-     */
-    private Integer certifyStatus;
-
-    /**
-     * 提币手续费
-     */
-    private BigDecimal idcardNo;
-    
-    private BigDecimal feeRatio;
-    @TableField(exist = false)
-    private String account;
-
-}

--
Gitblit v1.9.1