From 9d1a90e82afba77f14af37fe56bebdba5c17c89e Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Fri, 29 May 2020 15:40:26 +0800 Subject: [PATCH] Merge branch 'master' of https://gitee.com/chonggaoxiao/new_excoin.git --- src/main/java/com/xcong/excoin/common/system/service/impl/CommonServiceImpl.java | 32 ++++++ src/main/java/com/xcong/excoin/modules/symbols/parameter/vo/KlineDataVo.java | 40 ++++++++ src/main/java/com/xcong/excoin/common/system/controller/CommonController.java | 39 ++++++- src/main/java/com/xcong/excoin/common/system/mapper/CandlestickMapper.java | 21 ++++ src/main/java/com/xcong/excoin/utils/TypeJudgeUtils.java | 22 ++++ src/main/java/com/xcong/excoin/modules/symbols/parameter/dto/KlineDetailDto.java | 8 - src/main/java/com/xcong/excoin/common/contants/AppContants.java | 5 + src/main/java/com/xcong/excoin/common/system/service/CommonService.java | 11 ++ src/main/java/com/xcong/excoin/modules/symbols/controller/SymbolsController.java | 25 +++- src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java | 3 src/main/java/com/xcong/excoin/modules/symbols/service/impl/SymbolsServiceImpl.java | 43 ++++++++ src/main/java/com/xcong/excoin/quartz/job/UsdtCnyExchangePriceUpdateJob.java | 5 + src/main/resources/application.yml | 4 13 files changed, 235 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/xcong/excoin/common/contants/AppContants.java b/src/main/java/com/xcong/excoin/common/contants/AppContants.java index 9619ae1..6ad7724 100644 --- a/src/main/java/com/xcong/excoin/common/contants/AppContants.java +++ b/src/main/java/com/xcong/excoin/common/contants/AppContants.java @@ -59,4 +59,9 @@ */ public static final int HOME_SYMBOLS_CONTRACT = 2; + /** + * 验证码前缀 手机 + */ + public static final String VERIFY_CODE_PREFIX = "CODE_SMS_"; + } diff --git a/src/main/java/com/xcong/excoin/common/system/controller/CommonController.java b/src/main/java/com/xcong/excoin/common/system/controller/CommonController.java index db35bd2..8ba477e 100644 --- a/src/main/java/com/xcong/excoin/common/system/controller/CommonController.java +++ b/src/main/java/com/xcong/excoin/common/system/controller/CommonController.java @@ -1,14 +1,19 @@ package com.xcong.excoin.common.system.controller; +import cn.hutool.core.util.StrUtil; import com.xcong.excoin.common.contants.AppContants; import com.xcong.excoin.common.response.Result; +import com.xcong.excoin.common.system.service.CommonService; import com.xcong.excoin.utils.RedisUtils; import com.xcong.excoin.utils.SmsUtils; +import com.xcong.excoin.utils.mail.SubMailSend; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @@ -32,23 +37,38 @@ @Resource private RedisUtils redisUtils; + @Resource + private CommonService commonservice; + @ApiOperation(value = "获取验证码接口", notes = "获取验证码通用接口") @GetMapping(value = "/verifyCode") - public Result verifyCode(String account, String type) { + public Result verifyCode(@ApiParam(name = "account", value = "手机号或邮箱", required = true) @RequestParam(value = "account") String account, + @ApiParam(name = "type", value = "类型1-手机号2-邮箱", required = true) @RequestParam("type") String type) { log.info("#账号:{}, 类型:{}#", account, type); - int code = (int) ((Math.random() * 9 + 1) * 100000); + Integer code = (int) ((Math.random() * 9 + 1) * 100000); + if (StrUtil.isNotBlank(redisUtils.getString(AppContants.VERIFY_CODE_PREFIX + account))) { + return Result.fail("验证码已发送,请勿重复发"); + } + + // 发送手机验证码 if (AppContants.ACCOUNT_TYPE_MOBILE.equals(type)) { Map<String, Object> result = SmsUtils.sendVerifyCode(account, code); - if (SUCCESS.equals(result.get("resultstatus"))) { Map<String, Object> map = new HashMap<>(); - boolean flag = redisUtils.set("SMS_" + account, code, 120); + boolean flag = redisUtils.set(AppContants.VERIFY_CODE_PREFIX + account, code, 120); map.put("code", flag); return Result.ok("success", map); } + // 发送邮件验证码 } else if (AppContants.ACCOUNT_TYPE_EMAIL.equals(type)) { - return Result.ok("success"); + boolean flag = SubMailSend.sendMail(account, code.toString()); + if (flag) { + redisUtils.set(AppContants.VERIFY_CODE_PREFIX + account, code, 120); + return Result.ok("success"); + } else { + return Result.fail("发送失败"); + } } else { log.info("未定义账号类型"); return Result.fail("fail"); @@ -58,8 +78,13 @@ @ApiOperation(value = "验证验证码是否正确", notes = "验证验证码是否正确") @GetMapping(value = "/checkVerify") - public Result checkVerify() { - return null; + public Result checkVerify(@ApiParam(name = "account", value = "账号", required = true) @RequestParam("account") String account, + @ApiParam(name = "code", value = "验证码", required = true) @RequestParam("code") String code) { + boolean flag = commonservice.verifyCode(account, code); + if (flag) { + return Result.ok("success"); + } + return Result.fail("验证码错误"); } @ApiOperation(value = "文件上次接口", notes = "文件上传") diff --git a/src/main/java/com/xcong/excoin/common/system/mapper/CandlestickMapper.java b/src/main/java/com/xcong/excoin/common/system/mapper/CandlestickMapper.java new file mode 100644 index 0000000..4e6fca1 --- /dev/null +++ b/src/main/java/com/xcong/excoin/common/system/mapper/CandlestickMapper.java @@ -0,0 +1,21 @@ +package com.xcong.excoin.common.system.mapper; + +import com.huobi.client.model.Candlestick; +import com.xcong.excoin.modules.symbols.parameter.vo.KlineDataVo; +import com.xcong.excoin.utils.api.response.KlineReturn; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +/** + * @author wzy + * @date 2020-05-29 + **/ +@Mapper +public abstract class CandlestickMapper { + public static final CandlestickMapper INSTANCE = Mappers.getMapper(CandlestickMapper.class); + + @Mapping(source = "timestamp", target = "time") + public abstract KlineDataVo toKlineDataVo(Candlestick candlestick); + +} diff --git a/src/main/java/com/xcong/excoin/common/system/service/CommonService.java b/src/main/java/com/xcong/excoin/common/system/service/CommonService.java new file mode 100644 index 0000000..be1ed3f --- /dev/null +++ b/src/main/java/com/xcong/excoin/common/system/service/CommonService.java @@ -0,0 +1,11 @@ +package com.xcong.excoin.common.system.service; + + +/** + * @author helius + */ +public interface CommonService { + + public boolean verifyCode(String account, String code); + +} diff --git a/src/main/java/com/xcong/excoin/common/system/service/impl/CommonServiceImpl.java b/src/main/java/com/xcong/excoin/common/system/service/impl/CommonServiceImpl.java new file mode 100644 index 0000000..aad0d55 --- /dev/null +++ b/src/main/java/com/xcong/excoin/common/system/service/impl/CommonServiceImpl.java @@ -0,0 +1,32 @@ +package com.xcong.excoin.common.system.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.xcong.excoin.common.contants.AppContants; +import com.xcong.excoin.common.system.service.CommonService; +import com.xcong.excoin.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author wzy + * @date 2020-05-29 + **/ +@Slf4j +@Service +public class CommonServiceImpl implements CommonService { + + @Resource + private RedisUtils redisUtils; + + @Override + public boolean verifyCode(String account, String code) { + String cacheCode = redisUtils.getString(AppContants.VERIFY_CODE_PREFIX + account); + if (StrUtil.isBlank(cacheCode)) { + return false; + } + + return code.equals(cacheCode); + } +} diff --git a/src/main/java/com/xcong/excoin/modules/symbols/controller/SymbolsController.java b/src/main/java/com/xcong/excoin/modules/symbols/controller/SymbolsController.java index dd8786d..e8505e9 100644 --- a/src/main/java/com/xcong/excoin/modules/symbols/controller/SymbolsController.java +++ b/src/main/java/com/xcong/excoin/modules/symbols/controller/SymbolsController.java @@ -2,10 +2,11 @@ import com.xcong.excoin.common.response.Result; import com.xcong.excoin.modules.symbols.parameter.dto.KlineDetailDto; +import com.xcong.excoin.modules.symbols.parameter.vo.HomeSymbolsVo; +import com.xcong.excoin.modules.symbols.parameter.vo.KlineDataVo; import com.xcong.excoin.modules.symbols.service.SymbolsService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; +import com.xcong.excoin.utils.TypeJudgeUtils; +import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -26,21 +27,33 @@ private SymbolsService symbolsService; @ApiOperation(value = "轮询获取app首页币种交易信息", notes = "轮询获取app首页币种交易信息") + @ApiResponses({ + @ApiResponse(code = 0, message = "success", response = HomeSymbolsVo.class) + }) @GetMapping(value = "/homeSymbols") - public Result homeSymbols(@ApiParam(name = "type", value = "类型1-币币2-合约3-自选", required = true, example = "1") Integer type) { + public Result homeSymbols(@ApiParam(name = "type", value = "类型1-币币2-合约3-自选", required = true, example = "1") @RequestParam(value = "type") Integer type) { return symbolsService.homeSymbols(type); } @ApiOperation(value = "根据币种查询币种当前各种数据", notes = "根据币种查询币种当前各种数据") + @ApiResponses({ + @ApiResponse(code = 0, message = "success", response = HomeSymbolsVo.class) + }) @GetMapping(value = "/findSymbolData") - public Result findSymbolData(@ApiParam(name = "symbol", value="币种", required = true, example = "BTC/USDT") String symbol) { + public Result findSymbolData(@ApiParam(name = "symbol", value = "币种", required = true, example = "BTC/USDT") @RequestParam(value = "symbol") String symbol) { return symbolsService.findSymbolData(symbol); } @ApiOperation(value = "查询历史K线数据", notes = "查询历史K线数据") + @ApiResponses({ + @ApiResponse(code = 0, message = "success", response = KlineDataVo.class) + }) @PostMapping(value = "/klineDetail") public Result klineDetail(@RequestBody @Valid KlineDetailDto klineDetailDto) { - return null; + if (!TypeJudgeUtils.klinePeriod(klineDetailDto.getPeriod())) { + return Result.fail("非法参数"); + } + return symbolsService.findKlineDetails(klineDetailDto); } } diff --git a/src/main/java/com/xcong/excoin/modules/symbols/parameter/dto/KlineDetailDto.java b/src/main/java/com/xcong/excoin/modules/symbols/parameter/dto/KlineDetailDto.java index 5281ea8..32aa355 100644 --- a/src/main/java/com/xcong/excoin/modules/symbols/parameter/dto/KlineDetailDto.java +++ b/src/main/java/com/xcong/excoin/modules/symbols/parameter/dto/KlineDetailDto.java @@ -20,14 +20,10 @@ private String symbol; @NotNull - @ApiModelProperty(value = "", example = "5min") + @ApiModelProperty(value = "k线时长", example = "5min") private String period; @NotNull - @ApiModelProperty(value = "", example = "150") - private Integer size; - - @NotNull - @ApiModelProperty(value = "", example = "1") + @ApiModelProperty(value = "类型 1-币币2-合约", example = "1") private Integer type; } diff --git a/src/main/java/com/xcong/excoin/modules/symbols/parameter/vo/KlineDataVo.java b/src/main/java/com/xcong/excoin/modules/symbols/parameter/vo/KlineDataVo.java new file mode 100644 index 0000000..3484e4d --- /dev/null +++ b/src/main/java/com/xcong/excoin/modules/symbols/parameter/vo/KlineDataVo.java @@ -0,0 +1,40 @@ +package com.xcong.excoin.modules.symbols.parameter.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * k线返回类 + * + * @author wzy + * @date 2020-05-29 + **/ +@Data +@ApiModel(value = "KlineDataVo", description = "k线返回类") +public class KlineDataVo { + + @ApiModelProperty(value = "时间") + private long time; + + @ApiModelProperty(value = "开盘指数价") + private BigDecimal open; + + @ApiModelProperty(value = "收盘指数价") + private BigDecimal high; + + @ApiModelProperty(value = "最低指数价") + private BigDecimal low; + + @ApiModelProperty(value = "最高指数价") + private BigDecimal close; + + @ApiModelProperty(value = "成交量张数") + private BigDecimal volume; + + @ApiModelProperty(value = "成交量") + private BigDecimal amount; + +} diff --git a/src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java b/src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java index 2cad3b9..be91c71 100644 --- a/src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java +++ b/src/main/java/com/xcong/excoin/modules/symbols/service/SymbolsService.java @@ -2,6 +2,7 @@ import com.xcong.excoin.common.response.Result; +import com.xcong.excoin.modules.symbols.parameter.dto.KlineDetailDto; /** * @author wzy @@ -15,4 +16,6 @@ public Result findSymbolData(String symbol); + public Result findKlineDetails(KlineDetailDto klineDetailDto); + } diff --git a/src/main/java/com/xcong/excoin/modules/symbols/service/impl/SymbolsServiceImpl.java b/src/main/java/com/xcong/excoin/modules/symbols/service/impl/SymbolsServiceImpl.java index b6ba34e..aec29a5 100644 --- a/src/main/java/com/xcong/excoin/modules/symbols/service/impl/SymbolsServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/symbols/service/impl/SymbolsServiceImpl.java @@ -1,13 +1,17 @@ package com.xcong.excoin.modules.symbols.service.impl; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import com.huobi.client.model.Candlestick; import com.xcong.excoin.common.contants.AppContants; import com.xcong.excoin.common.enumerates.SymbolEnum; import com.xcong.excoin.common.response.Result; +import com.xcong.excoin.common.system.mapper.CandlestickMapper; import com.xcong.excoin.modules.platform.dao.PlatformCnyUsdtExchangeDao; import com.xcong.excoin.modules.platform.entity.PlatformCnyUsdtExchangeEntity; +import com.xcong.excoin.modules.symbols.parameter.dto.KlineDetailDto; import com.xcong.excoin.modules.symbols.parameter.vo.HomeSymbolsVo; +import com.xcong.excoin.modules.symbols.parameter.vo.KlineDataVo; import com.xcong.excoin.modules.symbols.service.SymbolsService; import com.xcong.excoin.utils.CoinTypeConvert; import com.xcong.excoin.utils.RedisUtils; @@ -99,12 +103,12 @@ // 币币行情 if (AppContants.HOME_SYMBOLS_COIN == type) { for (SymbolEnum symbolEnum : SymbolEnum.values()) { - list.add(getSymbolReturnData(symbolEnum.getName())); + list.add(getSymbolReturnData(symbolEnum.getValue())); } // 合约行情 } else if (AppContants.HOME_SYMBOLS_CONTRACT == type) { for (SymbolEnum symbolEnum : SymbolEnum.values()) { - list.add(getSymbolReturnData(symbolEnum.getName())); + list.add(getSymbolReturnData(symbolEnum.getValue())); } // 自选行情 } else { @@ -143,4 +147,39 @@ return homeSymbolsVo; } + + @Override + public Result findKlineDetails(KlineDetailDto klineDetailDto) { + String key = "KINE_{}_{}"; + // 币币k线数据 + if (AppContants.HOME_SYMBOLS_COIN == klineDetailDto.getType()) { + key = StrUtil.format(key, klineDetailDto.getSymbol(), klineDetailDto.getPeriod()); + // 合约k线数据 + } else { + key = StrUtil.format(key, klineDetailDto.getSymbol(), klineDetailDto.getPeriod()); + } + + Object data = redisUtils.get(key); + if (data != null) { + List list = (List) data; + int length = 0; + // 默认获取k线900个柱状(超出会报错) + int size = 900; + + if (list.size() > size) { + length = size - 1; + } else { + length = list.size() - 1; + } + + List<KlineDataVo> result = new ArrayList<>(length); + for (int i = length; i > 0; i--) { + Candlestick object = (Candlestick) list.get(i); + KlineDataVo klineDataVo = CandlestickMapper.INSTANCE.toKlineDataVo(object); + result.add(klineDataVo); + } + return Result.ok(result); + } + return Result.fail("获取数据失败"); + } } diff --git a/src/main/java/com/xcong/excoin/quartz/job/UsdtCnyExchangePriceUpdateJob.java b/src/main/java/com/xcong/excoin/quartz/job/UsdtCnyExchangePriceUpdateJob.java index 840250b..6f87c46 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/UsdtCnyExchangePriceUpdateJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/UsdtCnyExchangePriceUpdateJob.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.modules.platform.dao.PlatformCnyUsdtExchangeDao; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -20,6 +21,7 @@ * @author wzy * @date 2020-05-28 **/ +@Slf4j @Component @ConditionalOnProperty(prefix = "app", name = "other-job", havingValue = "true") public class UsdtCnyExchangePriceUpdateJob { @@ -56,6 +58,9 @@ String code = jsonObject.getString("code"); if ("200".equals(code)) { JSONObject jsonData = (JSONObject) jsonObject.get("data"); + log.info("{}", jsonData); + log.info("{}", jsonData.getDouble("price")); + log.info("{}", jsonData.getString("price")); cnyUsdtExchangeDao.updateUsdt(BigDecimal.valueOf(jsonData.getDouble("price"))); } } catch (Exception e) { diff --git a/src/main/java/com/xcong/excoin/utils/TypeJudgeUtils.java b/src/main/java/com/xcong/excoin/utils/TypeJudgeUtils.java index a3b933d..c7f511a 100644 --- a/src/main/java/com/xcong/excoin/utils/TypeJudgeUtils.java +++ b/src/main/java/com/xcong/excoin/utils/TypeJudgeUtils.java @@ -25,4 +25,26 @@ return false; } } + + /** + * 判断k线区间 + * + * @param period + * @return + */ + public static boolean klinePeriod(String period) { + switch (period) { + case "1min": + case "5min": + case "30min": + case "60min": + case "4hour": + case "1day": + case "1week": + return true; + default: + return false; + } + + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 61560cd..794fdc7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -96,9 +96,9 @@ # k线更新任务控制 kline-update-job: false #最新价任务控制 - newest-price-update-job: true + newest-price-update-job: false #其他任务控制 - other-job: true + other-job: false rsa: public_key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCf8UFZK54AiK4PRu7tNd+Z8qZ77o/QXCnk25DRmygVpOEu5mGNSAvfnWmKp2pEV2RljeXq3Rid/+LQkonaebMJeXKSF0yxL/VgyeT8JaQ5gNbOrdfdlc+mFkXJyzyJt8YkvApEdPRNSU2ENBn7mgRfD0BYPM4vZ6/rv+de38FJwIDAQAB -- Gitblit v1.9.1