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_"; } 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 = "文件上传") src/main/java/com/xcong/excoin/common/system/mapper/CandlestickMapper.java
New file @@ -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); } src/main/java/com/xcong/excoin/common/system/service/CommonService.java
New file @@ -0,0 +1,11 @@ package com.xcong.excoin.common.system.service; /** * @author helius */ public interface CommonService { public boolean verifyCode(String account, String code); } src/main/java/com/xcong/excoin/common/system/service/impl/CommonServiceImpl.java
New file @@ -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); } } 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); } } 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; } src/main/java/com/xcong/excoin/modules/symbols/parameter/vo/KlineDataVo.java
New file @@ -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; } 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); } 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("获取数据失败"); } } 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) { 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; } } } 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