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