parent
66b5d4d3f2
commit
b8d0d44e92
13 changed files with 738 additions and 6 deletions
@ -0,0 +1,2 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<module type="JAVA_MODULE" version="4" /> |
@ -0,0 +1,20 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project version="4"> |
||||
<component name="RemoteRepositoriesConfiguration"> |
||||
<remote-repository> |
||||
<option name="id" value="central" /> |
||||
<option name="name" value="Central Repository" /> |
||||
<option name="url" value="https://repo.maven.apache.org/maven2" /> |
||||
</remote-repository> |
||||
<remote-repository> |
||||
<option name="id" value="central" /> |
||||
<option name="name" value="Maven Central repository" /> |
||||
<option name="url" value="https://repo1.maven.org/maven2" /> |
||||
</remote-repository> |
||||
<remote-repository> |
||||
<option name="id" value="jboss.community" /> |
||||
<option name="name" value="JBoss Community repository" /> |
||||
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" /> |
||||
</remote-repository> |
||||
</component> |
||||
</project> |
@ -0,0 +1,64 @@ |
||||
package com.daqing.financial.gateway; |
||||
|
||||
import org.springframework.beans.factory.DisposableBean; |
||||
import org.springframework.context.ApplicationContext; |
||||
import org.springframework.context.ApplicationContextAware; |
||||
import org.springframework.context.annotation.Lazy; |
||||
import org.springframework.stereotype.Component; |
||||
|
||||
@Component |
||||
@Lazy(false) |
||||
public class SpringContextHolder implements ApplicationContextAware, DisposableBean { |
||||
|
||||
private static ApplicationContext applicationContext = null; |
||||
|
||||
|
||||
/** |
||||
* 取得存储在静态变量中的ApplicationContext. |
||||
*/ |
||||
public static ApplicationContext getApplicationContext() { |
||||
return applicationContext; |
||||
} |
||||
|
||||
/** |
||||
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
public static <T> T getBean(String name) { |
||||
return (T) applicationContext.getBean(name); |
||||
} |
||||
|
||||
/** |
||||
* 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型. |
||||
*/ |
||||
public static <T> T getBean(Class<T> requiredType) { |
||||
return applicationContext.getBean(requiredType); |
||||
} |
||||
|
||||
public static <T> T getBean(String name, Class<T> clazz) { |
||||
return getApplicationContext().getBean(name, clazz); |
||||
} |
||||
|
||||
/** |
||||
* 清除SpringContextHolder中的ApplicationContext为Null. |
||||
*/ |
||||
public static void clearHolder() { |
||||
applicationContext = null; |
||||
} |
||||
|
||||
/** |
||||
* 实现ApplicationContextAware接口, 注入Context到静态变量中. |
||||
*/ |
||||
@Override |
||||
public void setApplicationContext(ApplicationContext appContext) { |
||||
applicationContext = appContext; |
||||
} |
||||
|
||||
/** |
||||
* 实现DisposableBean接口, 在Context关闭时清理静态变量. |
||||
*/ |
||||
@Override |
||||
public void destroy() { |
||||
SpringContextHolder.clearHolder(); |
||||
} |
||||
} |
@ -0,0 +1,114 @@ |
||||
package com.daqing.financial.gateway.config; |
||||
|
||||
import com.alibaba.fastjson.JSONObject; |
||||
import com.daqing.financial.gateway.util.JwtUtil; |
||||
import org.apache.commons.lang3.StringUtils; |
||||
import org.springframework.beans.factory.annotation.Value; |
||||
import org.springframework.cloud.gateway.filter.GatewayFilterChain; |
||||
import org.springframework.cloud.gateway.filter.GlobalFilter; |
||||
import org.springframework.context.annotation.PropertySource; |
||||
import org.springframework.core.Ordered; |
||||
import org.springframework.core.io.buffer.DataBuffer; |
||||
import org.springframework.http.HttpStatus; |
||||
import org.springframework.http.server.reactive.ServerHttpRequest; |
||||
import org.springframework.http.server.reactive.ServerHttpResponse; |
||||
import org.springframework.stereotype.Component; |
||||
import org.springframework.util.CollectionUtils; |
||||
import org.springframework.web.server.ServerWebExchange; |
||||
import reactor.core.publisher.Mono; |
||||
|
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.Enumeration; |
||||
import java.util.List; |
||||
|
||||
@Component |
||||
@PropertySource(value = "classpath:jwt.properties") |
||||
public class ApiGlobalFilter implements GlobalFilter, Ordered { |
||||
|
||||
/** |
||||
* 不进行token校验的请求地址 |
||||
*/ |
||||
@Value("#{'${jwt.ignoreUrlList}'.split(',')}") |
||||
public List<String> ignoreUrl; |
||||
|
||||
/** |
||||
* 拦截所有的请求头 |
||||
* @param exchange |
||||
* @param chain |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { |
||||
String requestUrl = exchange.getRequest().getPath().toString(); |
||||
boolean status = CollectionUtils.contains((Enumeration<?>) ignoreUrl, requestUrl); |
||||
if (!status){ |
||||
String token = exchange.getRequest().getHeaders().getFirst("token"); |
||||
//type用于区分不同的端,在做校验token时需要
|
||||
String type= exchange.getRequest().getHeaders().getFirst("type"); |
||||
ServerHttpResponse response = exchange.getResponse(); |
||||
//没有数据
|
||||
if (StringUtils.isBlank(token) || StringUtils.isBlank(type)) { |
||||
JSONObject message = new JSONObject(); |
||||
message.put("code", ""); |
||||
message.put("message", "鉴权失败,无token或类型"); |
||||
byte[] bits = message.toString().getBytes(StandardCharsets.UTF_8); |
||||
DataBuffer buffer = response.bufferFactory().wrap(bits); |
||||
response.setStatusCode(HttpStatus.UNAUTHORIZED); |
||||
response.getHeaders().add("Content-Type", "text/json;charset=UTF-8"); |
||||
return response.writeWith(Mono.just(buffer)); |
||||
//有数据
|
||||
}else { |
||||
String prefix = this.getPrefix(type); |
||||
//校验token
|
||||
Long userId = verifyJWT(token ,prefix); |
||||
if (userId == null){ |
||||
JSONObject message = new JSONObject(); |
||||
message.put("message", "token错误"); |
||||
message.put("code", ""); |
||||
byte[] bits = message.toString().getBytes(StandardCharsets.UTF_8); |
||||
DataBuffer buffer = response.bufferFactory().wrap(bits); |
||||
response.setStatusCode(HttpStatus.UNAUTHORIZED); |
||||
response.getHeaders().add("Content-Type", "text/json;charset=UTF-8"); |
||||
return response.writeWith(Mono.just(buffer)); |
||||
} |
||||
//将现在的request,添加当前身份
|
||||
ServerHttpRequest mutableReq = exchange.getRequest().mutate().header("Authorization-UserId", String.valueOf(userId)).build(); |
||||
ServerWebExchange mutableExchange = exchange.mutate().request(mutableReq).build(); |
||||
return chain.filter(mutableExchange); |
||||
} |
||||
} |
||||
return chain.filter(exchange); |
||||
} |
||||
|
||||
/** |
||||
* JWT验证 |
||||
* @param token |
||||
* @return userPhone |
||||
*/ |
||||
private Long verifyJWT(String token, String prefix){ |
||||
return JwtUtil.verifyToken(token); |
||||
} |
||||
|
||||
/** |
||||
* 根据type获取前缀 |
||||
* @param type |
||||
* @return |
||||
*/ |
||||
private String getPrefix(String type){ |
||||
String prefix = null; |
||||
if ("1".equals(type)){ |
||||
prefix = "OPERATE"; |
||||
}else if ("2".equals(type)){ |
||||
prefix = "USER"; |
||||
}else if ("3".equals(type)){ |
||||
prefix = "WX"; |
||||
} |
||||
return prefix; |
||||
} |
||||
|
||||
@Override |
||||
public int getOrder() { |
||||
return -200; |
||||
} |
||||
} |
||||
|
@ -0,0 +1,70 @@ |
||||
package com.daqing.financial.gateway.util; |
||||
|
||||
import com.auth0.jwt.JWT; |
||||
import com.auth0.jwt.algorithms.Algorithm; |
||||
|
||||
import com.daqing.financial.gateway.SpringContextHolder; |
||||
|
||||
import java.util.Date; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* @author zcw |
||||
* @version 1.0 |
||||
* @date 2019/11/23 11:06 |
||||
* @description jwt工具类 |
||||
*/ |
||||
public class JwtUtil { |
||||
|
||||
private final static Algorithm algorithm = SpringContextHolder.getBean("algorithm", Algorithm.class); |
||||
|
||||
private final static OdcProperties properties = SpringContextHolder.getBean("odcProperties", OdcProperties.class); |
||||
|
||||
/** |
||||
* 创建token |
||||
* |
||||
* @param userId; |
||||
* @param timeout; 单位是秒 |
||||
*/ |
||||
public static String createJwtToken(Long userId, long timeout) { |
||||
return JWT.create() |
||||
.withClaim("member", userId) |
||||
.withExpiresAt(new Date(System.currentTimeMillis() + timeout * 1000)) |
||||
.sign(algorithm); |
||||
} |
||||
|
||||
/** |
||||
* token正确且有效,则返回userId |
||||
*/ |
||||
public static Long verifyToken(String token) { |
||||
try { |
||||
String noBearerToken = token.replaceFirst("Bearer ", ""); |
||||
Long userId = JWT.require(algorithm) |
||||
.build() |
||||
.verify(noBearerToken) |
||||
.getClaim("member") |
||||
.asLong(); |
||||
if (RedisUtil.get(getRedisKey(userId, noBearerToken)) != null) { |
||||
return userId; |
||||
} |
||||
} catch (Exception e) { |
||||
throw new OdcException(ResultCodeEnum.UN_AUTHORIZATION); |
||||
} |
||||
throw new OdcException(ResultCodeEnum.UN_AUTHORIZATION); |
||||
} |
||||
|
||||
public static String getRedisKey(Long userId, String token) { |
||||
return String.format(properties.getConfig().getTokenRedisKeyFormat(), userId, token); |
||||
} |
||||
|
||||
public static void putTokenToRedis(Long userId, String token) { |
||||
RedisUtil.setEx(getRedisKey(userId, token), "nothing", properties.getConfig().getTokenExpireSeconds()); |
||||
} |
||||
|
||||
public static void removeTokenByUserId(Long userId) { |
||||
Set<String> tokenSet = RedisUtil.keys(getRedisKey(userId, "*")); |
||||
for (String key : tokenSet) { |
||||
RedisUtil.del(key); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,24 @@ |
||||
package com.daqing.financial.gateway.util; |
||||
|
||||
import lombok.Data; |
||||
|
||||
@Data |
||||
public class OdcException extends RuntimeException { |
||||
|
||||
private int code; |
||||
|
||||
private ResultCodeEnum resultCodeEnum; |
||||
|
||||
public OdcException(ResultCodeEnum codeEnum) { |
||||
super(codeEnum.getRemark()); |
||||
code = codeEnum.getCode(); |
||||
} |
||||
|
||||
public int getCode() { |
||||
return code; |
||||
} |
||||
|
||||
public ResultCodeEnum getResultCodeEnum() { |
||||
return resultCodeEnum; |
||||
} |
||||
} |
@ -0,0 +1,50 @@ |
||||
package com.daqing.financial.gateway.util; |
||||
|
||||
import lombok.Data; |
||||
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||
import org.springframework.context.annotation.Configuration; |
||||
|
||||
@Data |
||||
@Configuration |
||||
@ConfigurationProperties(prefix = "com.odcchina", ignoreUnknownFields = true) |
||||
public class OdcProperties { |
||||
|
||||
private Oss oss = new Oss(); |
||||
|
||||
private Async async = new Async(); |
||||
|
||||
private Config config = new Config(); |
||||
|
||||
@Data |
||||
public static class Oss { |
||||
private String endpoint; |
||||
private String accessKeyId; |
||||
private String accessKeySecret; |
||||
private String bucketName; |
||||
private String prefixUrl; |
||||
} |
||||
|
||||
@Data |
||||
public static class Async { |
||||
private int corePoolSize = 10; |
||||
private int maxPoolSize = 40; |
||||
private int queueCapacity = 20; |
||||
private int keepAliveSeconds = 30; |
||||
} |
||||
|
||||
@Data |
||||
public static class Config { |
||||
|
||||
private String tokenHeader = "Authorization"; |
||||
|
||||
//登录token,redis key格式
|
||||
private String tokenRedisKeyFormat = "dcm:token:%d:%s"; |
||||
|
||||
//token有效期,10年
|
||||
private long tokenExpireSeconds = 315360000L; |
||||
|
||||
//限制只能登录一个
|
||||
private boolean limitLoginOneOnly = true; |
||||
|
||||
} |
||||
} |
@ -0,0 +1,298 @@ |
||||
package com.daqing.financial.gateway.util; |
||||
|
||||
|
||||
import com.daqing.financial.gateway.SpringContextHolder; |
||||
import org.springframework.data.redis.core.HashOperations; |
||||
import org.springframework.data.redis.core.ListOperations; |
||||
import org.springframework.data.redis.core.StringRedisTemplate; |
||||
import org.springframework.data.redis.core.ValueOperations; |
||||
|
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.util.concurrent.TimeUnit; |
||||
|
||||
/** |
||||
* redis工具类 |
||||
*/ |
||||
public class RedisUtil { |
||||
|
||||
private final static StringRedisTemplate stringRedisTemplate = SpringContextHolder.getBean("stringRedisTemplate"); |
||||
|
||||
/** |
||||
* 匹配key |
||||
*/ |
||||
public static Set<String> keys(String pattern) { |
||||
return stringRedisTemplate.keys(pattern); |
||||
} |
||||
|
||||
/** |
||||
* 删除一个key |
||||
*/ |
||||
public static void del(String key) { |
||||
stringRedisTemplate.delete(key); |
||||
} |
||||
|
||||
/** |
||||
* 批量删除key |
||||
*/ |
||||
public static void delByPattern(String pattern) { |
||||
Set<String> keySet = keys(pattern); |
||||
stringRedisTemplate.delete(keySet); |
||||
} |
||||
|
||||
/** |
||||
* 设置过期时间,单位为秒 |
||||
*/ |
||||
public static boolean expire(String key, long seconds) { |
||||
return stringRedisTemplate.expire(key, seconds, TimeUnit.SECONDS); |
||||
} |
||||
|
||||
/** |
||||
* 获取自动过期时间 |
||||
*/ |
||||
public static long ttl(String key) { |
||||
return stringRedisTemplate.getExpire(key, TimeUnit.SECONDS); |
||||
} |
||||
|
||||
/** |
||||
* 移除过期时间 |
||||
*/ |
||||
public static boolean persist(String key) { |
||||
return stringRedisTemplate.persist(key); |
||||
} |
||||
|
||||
/////// String 操作
|
||||
|
||||
/** |
||||
* 给key赋值 |
||||
*/ |
||||
public static void set(String key, String value) { |
||||
ValueOperations<String, String> op = stringRedisTemplate.opsForValue(); |
||||
op.set(key, value); |
||||
} |
||||
|
||||
/** |
||||
* 给key赋值,并设置过期时间,单位为秒 |
||||
*/ |
||||
public static void setEx(String key, String value, long seconds) { |
||||
set(key, value); |
||||
expire(key, seconds); |
||||
} |
||||
|
||||
/** |
||||
* 将key的值加num |
||||
*/ |
||||
public static void incrBy(String key, long num) { |
||||
ValueOperations<String, String> op = stringRedisTemplate.opsForValue(); |
||||
op.increment(key, num); |
||||
} |
||||
|
||||
/** |
||||
* 获取key的值 |
||||
*/ |
||||
public static String get(String key) { |
||||
ValueOperations<String, String> op = stringRedisTemplate.opsForValue(); |
||||
return op.get(key); |
||||
} |
||||
|
||||
/////// list操作
|
||||
|
||||
/** |
||||
* 插入到表头 |
||||
*/ |
||||
public static void lPush(String key, String... values) { |
||||
ListOperations<String, String> listOp = stringRedisTemplate.opsForList(); |
||||
listOp.leftPushAll(key, values); |
||||
} |
||||
|
||||
/** |
||||
* 移除第一个 |
||||
*/ |
||||
public static String rPop(String key) { |
||||
ListOperations<String, String> listOp = stringRedisTemplate.opsForList(); |
||||
return listOp.rightPop(key); |
||||
} |
||||
|
||||
/** |
||||
* 获取list所有 |
||||
* |
||||
* @param key |
||||
* @param start |
||||
* @param end |
||||
* @return |
||||
*/ |
||||
public static List<String> lRange(String key, int start, int end) { |
||||
ListOperations<String, String> opsForList = stringRedisTemplate.opsForList(); |
||||
return opsForList.range(key, start, end); |
||||
} |
||||
|
||||
/////// hash
|
||||
|
||||
/* |
||||
* public static void hset(String key,String hashKey,String value){ |
||||
* HashOperations<String,String,String> opsForHash = |
||||
* stringRedisTemplate.opsForHash(); opsForHash.put(key, hashKey, value); } |
||||
*/ |
||||
/////// set
|
||||
/////// sorted set
|
||||
|
||||
/** |
||||
* 存放list |
||||
* @param key |
||||
* @param list |
||||
*/ |
||||
public static void setList(String key, List<String> list){ |
||||
ListOperations<String, String> opsForList = stringRedisTemplate.opsForList(); |
||||
opsForList.leftPushAll(key, list); |
||||
} |
||||
|
||||
/** |
||||
* HashGet |
||||
* @param key 键 不能为null |
||||
* @param item 项 不能为null |
||||
* @return 值 |
||||
*/ |
||||
public static Object hGet(String key,String item){ |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
return mapOp.get(key, item); |
||||
} |
||||
|
||||
/** |
||||
* 获取hashKey对应的所有键值 |
||||
* @param key 键 |
||||
* @return 对应的多个键值 |
||||
*/ |
||||
public static Map<Object,Object> hmGet(String key){ |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
return mapOp.entries(key); |
||||
} |
||||
|
||||
/** |
||||
* HashSet |
||||
* @param key 键 |
||||
* @param map 对应多个键值 |
||||
* @return true 成功 false 失败 |
||||
*/ |
||||
public static boolean hmSet(String key, Map<String,Object> map){ |
||||
try { |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
mapOp.putAll(key, map); |
||||
return true; |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* HashSet 并设置时间 |
||||
* @param key 键 |
||||
* @param map 对应多个键值 |
||||
* @param time 时间(秒) |
||||
* @return true成功 false失败 |
||||
*/ |
||||
public static boolean hmset(String key, Map<String,Object> map, long time){ |
||||
try { |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
mapOp.putAll(key, map); |
||||
if(time>0){ |
||||
expire(key, time); |
||||
} |
||||
return true; |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 向一张hash表中放入数据,如果不存在将创建 |
||||
* @param key 键 |
||||
* @param item 项 |
||||
* @param value 值 |
||||
* @return true 成功 false失败 |
||||
*/ |
||||
public static boolean hset(String key,String item,Object value) { |
||||
try { |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
mapOp.put(key, item, value); |
||||
return true; |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 向一张hash表中放入数据,如果不存在将创建 |
||||
* @param key 键 |
||||
* @param item 项 |
||||
* @param value 值 |
||||
* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 |
||||
* @return true 成功 false失败 |
||||
*/ |
||||
public static boolean hset(String key,String item,Object value,long time) { |
||||
try { |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
mapOp.put(key, item, value); |
||||
if(time>0){ |
||||
expire(key, time); |
||||
} |
||||
return true; |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 删除hash表中的值 |
||||
* @param key 键 不能为null |
||||
* @param item 项 可以使多个 不能为null |
||||
*/ |
||||
public static void hdel(String key, Object... item){ |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
|
||||
mapOp.delete(key,item); |
||||
} |
||||
|
||||
/** |
||||
* 判断hash表中是否有该项的值 |
||||
* @param key 键 不能为null |
||||
* @param item 项 不能为null |
||||
* @return true 存在 false不存在 |
||||
*/ |
||||
public static boolean hHasKey(String key, String item){ |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
|
||||
return mapOp.hasKey(key, item); |
||||
} |
||||
|
||||
/** |
||||
* hash递增 如果不存在,就会创建一个 并把新增后的值返回 |
||||
* @param key 键 |
||||
* @param item 项 |
||||
* @param by 要增加几(大于0) |
||||
* @return |
||||
*/ |
||||
public static double hincr(String key, String item,double by){ |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
|
||||
return mapOp.increment(key, item, by); |
||||
} |
||||
|
||||
/** |
||||
* hash递减 |
||||
* @param key 键 |
||||
* @param item 项 |
||||
* @param by 要减少记(小于0) |
||||
* @return |
||||
*/ |
||||
public static double hdecr(String key, String item,double by){ |
||||
HashOperations<String, Object, Object> mapOp = stringRedisTemplate.opsForHash(); |
||||
|
||||
return mapOp.increment(key, item,-by); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,62 @@ |
||||
package com.daqing.financial.gateway.util; |
||||
|
||||
public enum ResultCodeEnum { |
||||
|
||||
SUCCESS(0, "请求成功"), |
||||
BAD_REQUEST(400, "错误请求"), |
||||
UN_AUTHORIZATION(401, "未授权"), |
||||
SERVER_EXCEPTION(500, "服务器异常"), |
||||
|
||||
ACCOUNT_NOT_EXIST(10000, "账号不存在"), |
||||
ACCOUNT_NOT_BIND(10001, "账号未绑定钱包"), |
||||
ACCOUNT_NOT_ACTIVE(10002, "账号未激活"), |
||||
ACCOUNT_EXIST(10003, "账号已存在,请登录"), |
||||
COIN_ADDRESS_IS_NOT_EXIST(10004, "该币种地址不存在"), |
||||
COIN_NAME_IS_NOT_EXIST(10005, "该币种不存在"), |
||||
|
||||
WALLET_BAD_PARAM(10100, "非法参数,禁止访问他人账号"), |
||||
WALLET_NOT_ENOUGH(10101, "可用余额不足"), |
||||
SUB_ACCOUNT_NOT_ALLOW_WITHDRAW(10102, "子账号不允许提币"), |
||||
USER_NAME_ALREADY_EXISTS(10103,"用户名已存在"), |
||||
USER_EMAIL_ALREADY_EXISTS(10104,"邮箱已存在"), |
||||
INVITATION_CODE_NOT_EXIST(10105,"邀请码不存在"), |
||||
DEVICE_EXIST(10106,"设备号相同"), |
||||
LOGINPASSWORD_ERROR(10107,"登录密码错误"), |
||||
ACCOUNT_DISABLED(10108,"账号已禁用"), |
||||
USER_NAME_IS_ENABLE(10109,"用户名不存在"), |
||||
USER_IS_ACTIVE(10111,"该用户已激活"), |
||||
PAY_PASSWORD_IS_ERROR(10112,"支付密码错误"), |
||||
USER_IS_ACTIVE_MAX(10113,"您的激活次数已上线"), |
||||
WITHDRAW_IS_ENABLE(10114,"该币种已关闭提币通道"), |
||||
WITHDRAW_IS_NOT_BEGIN_TIME(10115,"未到提币时间"), |
||||
WITHDRAW_IS_SUPER_END_TIME(10116,"提币时间已过"), |
||||
WITHDRAW_MIN_ERROR(10117,"不能小于最小提币金额"), |
||||
WITHDRAW_MAX_ERROR(10118,"不能大于最大提币金额"), |
||||
WITHDRAW_MAX_TODAY(10120,"当日提币金额已上限"), |
||||
TRANSFER_IS_ENABLE(10121,"该币种已关闭转账通道"), |
||||
TRANSFER_MIN_ERROR(10122,"不能小于最小转账金额"), |
||||
TRANSFER_MAX_ERROR(10123,"不能大于最大转账金额"), |
||||
TRANSFER_MAX_TODAY(10124,"当日转账金额已上限"), |
||||
USERNAME_AND_EMAIL_ERROR(10125,"用户名和邮箱不匹配"), |
||||
EMAIL_CODE_IS_ERROR(10126,"验证码错误"), |
||||
PAY_PASSWORD_IS_NULL(10127,"请先设置支付密码"), |
||||
CHAIN_IS_ERROR(10128,"链上异常请联系管理员"); |
||||
|
||||
|
||||
|
||||
private final int code; |
||||
private final String remark; |
||||
|
||||
ResultCodeEnum(int code, String remark) { |
||||
this.code = code; |
||||
this.remark = remark; |
||||
} |
||||
|
||||
public int getCode() { |
||||
return code; |
||||
} |
||||
|
||||
public String getRemark() { |
||||
return remark; |
||||
} |
||||
} |
@ -0,0 +1 @@ |
||||
jwt.ignoreUrlList=/route-api/login,/route-api/refresh |
Loading…
Reference in new issue