m2pool项目提交

Signed-off-by: jxy_duyi <2826961034@qq.com>
This commit is contained in:
jxy_duyi
2025-04-10 18:44:21 +08:00
parent faaeb24007
commit c4f34073c4
508 changed files with 50991 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
package com.m2pool.oapi;
import com.m2pool.common.security.annotation.EnableCustomConfig;
import com.m2pool.common.security.annotation.EnableM2PoolFeignClients;
import com.m2pool.common.swagger.annotation.EnableCustomSwagger2;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @Description open api服务入口类
* @Date 2024/6/14 13:42
* @Author dy
*/
@EnableCustomConfig
@EnableCustomSwagger2
@EnableM2PoolFeignClients
@SpringBootApplication
@MapperScan({"com.m2pool.oapi.mapper"})
public class M2OApiApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(M2OApiApplication.class,args);
System.out.println("m2pool矿池 开放api微服务启动成功");
}
}

View File

@@ -0,0 +1,84 @@
package com.m2pool.oapi.controller;
import com.m2pool.common.core.web.Result.AjaxResult;
import com.m2pool.common.core.web.controller.BaseController;
import com.m2pool.common.security.annotation.OpenApiPermissions;
import com.m2pool.common.security.annotation.RequiresPermissions;
import com.m2pool.oapi.service.AccountService;
import com.m2pool.oapi.vo.AccountDateVo;
import com.m2pool.oapi.vo.AccountVo;
import com.m2pool.oapi.vo.CoinVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @Description 统一请求接口
* @Date 2024/6/14 9:54
* @Author dy
*/
@RestController
@RequestMapping("/account")
public class AccountController extends BaseController {
@Autowired
private AccountService accountService;
@PostMapping("/hashrate_real")
@ApiOperation(value = "挖矿账户实时算力、24小时算力")
@OpenApiPermissions("account")
public AjaxResult hashrate_real(@Valid @RequestBody AccountVo vo){
return accountService.getHashRateReal(vo);
}
@PostMapping("/hashrate_history")
@ApiOperation(value = "挖矿账户历史算力(只支持24小时,最多3个月)")
@OpenApiPermissions("account")
public AjaxResult hashRateHistory(@Valid @RequestBody AccountDateVo vo){
return accountService.getHashRateHistory(vo);
}
@PostMapping("/hashrate_last24h")
@ApiOperation(value = "挖矿账户最近24小时算力(30分钟算力)")
@OpenApiPermissions("account")
public AjaxResult getHashRateLast24h(@Valid @RequestBody AccountVo vo){
return accountService.getHashRateLast24h(vo);
}
@PostMapping("/miners_list")
@ApiOperation(value = "挖矿账号矿工列表")
@OpenApiPermissions("account")
public AjaxResult minersList(@Valid @RequestBody AccountVo vo){
return accountService.getMinersList(vo);
}
@PostMapping("/watch")
@ApiOperation(value = "挖矿账号矿工总览")
@OpenApiPermissions("account")
public AjaxResult watch(@Valid @RequestBody AccountVo vo){
return accountService.getWatch(vo);
}
@GetMapping("/test1")
@ApiOperation(value = "挖矿账号矿工总览")
//@OpenApiPermissions("account")
public AjaxResult test1(){
return AjaxResult.success();
}
}

View File

@@ -0,0 +1,62 @@
package com.m2pool.oapi.controller;
import com.m2pool.common.core.web.Result.AjaxResult;
import com.m2pool.common.core.web.controller.BaseController;
import com.m2pool.common.security.annotation.OpenApiPermissions;
import com.m2pool.common.security.annotation.RequiresPermissions;
import com.m2pool.oapi.service.MinerService;
import com.m2pool.oapi.vo.AccountDateVo;
import com.m2pool.oapi.vo.AccountMinerDateVo;
import com.m2pool.oapi.vo.AccountMinerVo;
import com.m2pool.oapi.vo.AccountVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
* @Description 矿机开放api统一请求接口
* @Date 2024/6/14 9:54
* @Author dy
*/
@RestController
@RequestMapping("/miner")
public class MinerController extends BaseController {
@Autowired
private MinerService minerService;
@PostMapping("/hashrate_real")
@ApiOperation(value = "挖矿账户实时算力、24小时算力")
@OpenApiPermissions("miner")
public AjaxResult hashrate_real(@Valid @RequestBody AccountMinerVo vo){
return minerService.getHashRateReal(vo);
}
@PostMapping("/hashrate_history")
@ApiOperation(value = "挖矿账户历史算力(只支持24小时,最多3个月)")
@OpenApiPermissions("miner")
public AjaxResult hashRateHistory(@Valid @RequestBody AccountMinerDateVo vo){
return minerService.getHashRateHistory(vo);
}
@PostMapping("/hashrate_last24h")
@ApiOperation(value = "挖矿账户最近24小时算力(30分钟算力)")
@OpenApiPermissions("miner")
public AjaxResult getHashRateLast24h(@Valid @RequestBody AccountMinerVo vo){
return minerService.getHashRateLast24h(vo);
}
}

View File

@@ -0,0 +1,78 @@
package com.m2pool.oapi.controller;
import com.m2pool.common.core.annotation.RateLimiter;
import com.m2pool.common.core.enums.LimitType;
import com.m2pool.common.core.web.Result.AjaxResult;
import com.m2pool.common.core.web.controller.BaseController;
import com.m2pool.common.security.annotation.OpenApiPermissions;
import com.m2pool.common.security.annotation.RequiresPermissions;
import com.m2pool.oapi.service.PoolService;
import com.m2pool.oapi.vo.CoinVo;
import com.m2pool.oapi.vo.DateVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @Description 统一请求接口
* @Date 2024/6/14 9:54
* @Author dy
*/
@RestController
@RequestMapping("/pool")
public class PoolController extends BaseController {
@Autowired
private PoolService poolService;
@GetMapping("/hashrate")
@ApiOperation(value = "矿池实时算力")
@OpenApiPermissions("pool")
public AjaxResult hashrate(@Valid CoinVo vo){
return poolService.getHashRate(vo);
}
@GetMapping("/hashrate_history")
@ApiOperation(value = "矿池历史算力(最多3个月)")
@OpenApiPermissions("pool")
public AjaxResult hashRateHistory(@Valid DateVo vo){
return poolService.getHashRateHistory(vo);
}
@GetMapping("/miners_list")
@ApiOperation(value = "矿池当前矿工数")
@OpenApiPermissions("pool")
public AjaxResult getMinersList(@Valid CoinVo vo){
return poolService.getMinersList(vo);
}
@GetMapping("/watch")
@ApiOperation(value = "矿池总览")
@OpenApiPermissions("pool")
@RateLimiter(time = 1,count = 5,limitType = LimitType.IP)
public AjaxResult watch(@Valid CoinVo vo){
return poolService.getWatch(vo);
}
@PostMapping("/test")
@ApiOperation(value = "矿池总览")
@OpenApiPermissions("pool")
public AjaxResult test(@Valid @RequestBody CoinVo vo){
return AjaxResult.success();
}
}

View File

@@ -0,0 +1,24 @@
package com.m2pool.oapi.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class HashRateDto implements Serializable {
/** 实时(30m)算力 */
@JsonProperty("hashrate")
private BigDecimal mhs;
private Date date;
}

View File

@@ -0,0 +1,26 @@
package com.m2pool.oapi.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.m2pool.common.core.utils.uuid.UUID;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class HashRateHistory24hDto implements Serializable {
/** 24h算力 */
@JsonProperty("hashrate_24h")
private List<HashRateDto> list;
/** 单位 h/s, kh/s, mh/s, gh/sth/s */
private String unit;
}

View File

@@ -0,0 +1,24 @@
package com.m2pool.oapi.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class HashRateHistory30mDto implements Serializable {
/** 实时(30m)算力 */
@JsonProperty("hashrate_30m")
private List<HashRateDto> list;
/** 单位 h/s, kh/s, mh/s, gh/sth/s */
private String unit;
}

View File

@@ -0,0 +1,29 @@
package com.m2pool.oapi.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class HashRateRealDto implements Serializable {
/** 实时(30m)算力 */
@JsonProperty("hashrate_realtime")
private BigDecimal mhs;
/** 有效提交数 */
@JsonProperty("hashrate_24h")
private BigDecimal mhs24h;
/** 单位 h/s, kh/s, mh/s, gh/sth/s */
private String unit;
}

View File

@@ -0,0 +1,23 @@
package com.m2pool.oapi.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class MinerStateDto implements Serializable {
/** 实时(30m)算力 */
private String miner;
private int state;
}

View File

@@ -0,0 +1,22 @@
package com.m2pool.oapi.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class MinerStateListDto implements Serializable {
/** 24h算力 */
@JsonProperty("miner_list")
private List<MinerStateDto> list;
}

View File

@@ -0,0 +1,24 @@
package com.m2pool.oapi.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class MinerWatchDto implements Serializable {
private long total;
private long online;
private long offline;
private long timeout;
}

View File

@@ -0,0 +1,28 @@
package com.m2pool.oapi.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class PoolHashRateHistoryDto implements Serializable {
/** 矿池(30m)算力 */
@JsonProperty("hashrate_30m")
private List<HashRateDto> mhsList;
/** 矿池(24h)算力 */
@JsonProperty("hashrate_24h")
private List<HashRateDto> mhs24hList;
/** 单位 h/s, kh/s, mh/s, gh/sth/s */
private String unit;
}

View File

@@ -0,0 +1,36 @@
package com.m2pool.oapi.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
/**
* @Description 矿池总览
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class PoolWatchDto implements Serializable {
@JsonProperty("pool_fee")
private String fee;
@JsonProperty("min_pay")
private double minPay;
@JsonProperty("history_last_7days")
private List<HashRateDto> list;
private long miners;
@JsonProperty("hashrate")
private BigDecimal mhs;
@JsonProperty("last_found")
private long height;
private String unit;
}

View File

@@ -0,0 +1,25 @@
package com.m2pool.oapi.entity;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class ApiKeyInfo implements Serializable {
/** api_key */
private String key;
private String ip;
private String user;
}

View File

@@ -0,0 +1,22 @@
package com.m2pool.oapi.entity;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @Description 曲线图数据结构
* @Date 2024/6/13 11:17
* @Author dy
*/
@Data
public class MinerState implements Serializable {
/** 实时(30m)算力 */
@JsonProperty("hashrate")
private String miner;
private String state;
}

View File

@@ -0,0 +1,49 @@
package com.m2pool.oapi.enums;
/**
* @Description 矿池默认起付额
* @Date 2022/5/20 11:15
* @Author 杜懿
*/
public enum PoolAmount {
GRS("grs", 100),
MONA("mona", 100),
DGB_SKEIN("dgb_skein", 100),
DGB_QUBIT("dgb_qubit", 100),
DGB_ODO("dgb_odo", 100),
DGB_QUBIT_A10("dgb_qubit_a10", 100),
DGB_SKEIN_A10("dgb_skein_a10", 100),
DGB_ODO_B20("dgb_odo_b20", 100),
NEXA("nexa", 10000),
RXD("rxd", 10000),
ALPH("alph", 10000),
ENX("enx", 10000);
/** 币种参数名 */
private final String coin;
/** 单位 */
private final double amount;
PoolAmount(String coin, double amount) {
this.coin = coin;
this.amount = amount;
}
public String getCoin() {
return coin;
}
public double getAmount(){return amount;}
public static double getAmountByCoin(String coin){
for (PoolAmount t : PoolAmount.values()) {
if(t.getCoin().equals(coin)){
return t.getAmount();
}
}
return 10000;
}
}

View File

@@ -0,0 +1,62 @@
package com.m2pool.oapi.enums;
/**
* @Description 矿池单位换算
* @Date 2022/5/20 11:15
* @Author 杜懿
*/
public enum PoolUnits {
GRS("grs", "MH/s", 1000, 1000),
MONA("mona", "MH/s", 1000, 1000),
DGB_SKEIN("dgb_skein", "MH/s", 1000, 1000),
DGB_QUBIT("dgb_qubit", "MH/s", 1000, 1000),
DGB_ODO("dgb_odo", "MH/s", 1000, 1000),
DGB2_ODO("dgb2_odo", "MH/s", 1000, 1000),
DGB_QUBIT_A10("dgb_qubit_a10", "MH/s", 1000, 1000),
DGB_SKEIN_A10("dgb_skein_a10", "MH/s", 1000, 1000),
DGB_ODO_B20("dgb_odo_b20", "MH/s", 1000, 1000),
NEXA("nexa", "MH/s", 1000*1000, 1000),
RXD("rxd", "MH/s", 1000*1000, 1000),
ALPH("aplh", "MH/s", 1000*1000, 1000),
ENX("enx", "MH/s", 1000*1000, 1000);
/** 币种参数名 */
private final String coin;
/** 矿池数据单位 */
private final String unit;
/** 换算率 数据库原始数据换算为H/s的换算率 */
private final int hRate ;
/** 换算率 数据库原始数据换算为H/s的换算率 */
private final int gRate ;
PoolUnits(String coin, String unit, int hRate, int gRate) {
this.coin = coin;
this.unit = unit;
this.hRate = hRate;
this.gRate = gRate;
}
public String getCoin() {
return coin;
}
public String getUnit() {
return unit;
}
public int gethRate() {
return hRate;
}
public int getgRate() {
return gRate;
}
}

View File

@@ -0,0 +1,34 @@
package com.m2pool.oapi.mapper;
import com.m2pool.common.datasource.annotation.HashRateDB;
import com.m2pool.common.datasource.annotation.InfoDB;
import com.m2pool.oapi.dto.HashRateDto;
import com.m2pool.oapi.dto.HashRateRealDto;
import com.m2pool.oapi.entity.MinerState;
import com.m2pool.oapi.vo.AccountDateVo;
import com.m2pool.oapi.vo.AccountVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Description TODO
* @Date 2022/8/30 17:47
* @Author 杜懿
*/
@InfoDB
public interface AccountMapper {
@HashRateDB
public List<HashRateRealDto> getAccountRealHashRateListByCoinAndAccount(@Param("vo") AccountVo vo);
public List<HashRateDto> getAccountHashRateHistory24hListByCoinAndAccount(@Param("vo") AccountDateVo vo);
public List<HashRateDto> getAccountHashRateHistory30mListByCoinAndAccount(@Param("vo") AccountVo vo,@Param("start") String start);
@HashRateDB
public List<MinerState> getMinerListByCoinAndAccount(@Param("vo") AccountVo vo);
}

View File

@@ -0,0 +1,33 @@
package com.m2pool.oapi.mapper;
import com.m2pool.common.datasource.annotation.HashRateDB;
import com.m2pool.common.datasource.annotation.InfoDB;
import com.m2pool.oapi.dto.HashRateDto;
import com.m2pool.oapi.dto.HashRateRealDto;
import com.m2pool.oapi.vo.AccountDateVo;
import com.m2pool.oapi.vo.AccountMinerDateVo;
import com.m2pool.oapi.vo.AccountMinerVo;
import com.m2pool.oapi.vo.AccountVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Description TODO
* @Date 2022/8/30 17:47
* @Author 杜懿
*/
@InfoDB
public interface MinerMapper {
@HashRateDB
public HashRateRealDto getMinerRealHashRateByCoinAndAccountMiner(@Param("vo") AccountMinerVo vo);
public List<HashRateDto> getMinerHashRateHistory24hListByCoinAndAccountMiner(@Param("vo") AccountMinerDateVo vo);
public List<HashRateDto> getMinerHashRateHistory30mListByCoinAndAccountMiner(@Param("vo") AccountMinerVo vo, @Param("start") String start);
}

View File

@@ -0,0 +1,42 @@
package com.m2pool.oapi.mapper;
import com.m2pool.common.datasource.annotation.HashRateDB;
import com.m2pool.common.datasource.annotation.InfoDB;
import com.m2pool.oapi.dto.HashRateDto;
import com.m2pool.oapi.dto.HashRateRealDto;
import com.m2pool.oapi.dto.PoolWatchDto;
import com.m2pool.oapi.entity.MinerState;
import com.m2pool.oapi.vo.AccountVo;
import com.m2pool.oapi.vo.CoinVo;
import com.m2pool.oapi.vo.DateVo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Description TODO
* @Date 2022/8/30 17:47
* @Author 杜懿
*/
@InfoDB
public interface PoolMapper {
@HashRateDB
public HashRateRealDto getPoolRealHashRateListByCoin(@Param("vo") CoinVo vo);
public List<HashRateDto> getPoolHashRateHistory24hListByCoin(@Param("vo") DateVo vo);
public List<HashRateDto> getPoolHashRateHistory30mListByCoin(@Param("vo") DateVo vo);
@HashRateDB
public List<MinerState> getMinerListByCoin(@Param("vo") CoinVo vo);
@HashRateDB
public PoolWatchDto getPoolWatchByCoin(@Param("vo") CoinVo vo);
@HashRateDB
public HashRateDto getPoolRealHashRateByCoin(@Param("vo") CoinVo vo);
}

View File

@@ -0,0 +1,25 @@
package com.m2pool.oapi.service;
import com.m2pool.common.core.web.Result.AjaxResult;
import com.m2pool.oapi.vo.AccountDateVo;
import com.m2pool.oapi.vo.AccountVo;
import com.m2pool.oapi.vo.DateVo;
/**
* @Description 开放api 矿池 相关服务类
* @Date 2024/6/14 11:40
* @Author dy
*/
public interface AccountService {
public AjaxResult getHashRateReal(AccountVo vo);
public AjaxResult getHashRateHistory(AccountDateVo vo);
public AjaxResult getHashRateLast24h(AccountVo vo);
public AjaxResult getMinersList(AccountVo vo);
public AjaxResult getWatch(AccountVo vo);
}

View File

@@ -0,0 +1,23 @@
package com.m2pool.oapi.service;
import com.m2pool.common.core.web.Result.AjaxResult;
import com.m2pool.oapi.vo.AccountDateVo;
import com.m2pool.oapi.vo.AccountMinerDateVo;
import com.m2pool.oapi.vo.AccountMinerVo;
import com.m2pool.oapi.vo.AccountVo;
/**
* @Description 开放api 矿池 相关服务类
* @Date 2024/6/14 11:40
* @Author dy
*/
public interface MinerService {
public AjaxResult getHashRateReal(AccountMinerVo vo);
public AjaxResult getHashRateHistory(AccountMinerDateVo vo);
public AjaxResult getHashRateLast24h(AccountMinerVo vo);
}

View File

@@ -0,0 +1,22 @@
package com.m2pool.oapi.service;
import com.m2pool.common.core.web.Result.AjaxResult;
import com.m2pool.oapi.vo.CoinVo;
import com.m2pool.oapi.vo.DateVo;
/**
* @Description 开放api 矿池 相关服务类
* @Date 2024/6/14 11:40
* @Author dy
*/
public interface PoolService {
public AjaxResult getHashRate(CoinVo vo);
public AjaxResult getHashRateHistory(DateVo vo);
public AjaxResult getMinersList(CoinVo vo);
public AjaxResult getWatch(CoinVo vo);
}

View File

@@ -0,0 +1,192 @@
package com.m2pool.oapi.service.impl;
import com.m2pool.common.core.text.Convert;
import com.m2pool.common.core.utils.DateUtils;
import com.m2pool.common.core.utils.StringUtils;
import com.m2pool.common.core.web.Result.AjaxResult;
import com.m2pool.oapi.dto.*;
import com.m2pool.oapi.entity.MinerState;
import com.m2pool.oapi.enums.PoolUnits;
import com.m2pool.oapi.mapper.AccountMapper;
import com.m2pool.oapi.service.AccountService;
import com.m2pool.oapi.utils.EnumUtils;
import com.m2pool.oapi.vo.AccountDateVo;
import com.m2pool.oapi.vo.AccountVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description TODO
* @Date 2024/9/13 10:47
* @Author 杜懿
*/
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountMapper accountMapperMapper;
@Override
public AjaxResult getHashRateReal(AccountVo vo) {
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
return AjaxResult.error("coin error");
}
List<HashRateRealDto> list = accountMapperMapper.getAccountRealHashRateListByCoinAndAccount(vo);
BigDecimal mhs = list.stream().map(e -> {
return e.getMhs();
}).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal mhs24h = list.stream().map(e -> {
return e.getMhs24h();
}).reduce(BigDecimal.ZERO, BigDecimal::add);
HashRateRealDto dto = new HashRateRealDto();
dto.setUnit(unit.getUnit());
dto.setMhs(mhs);
dto.setMhs24h(mhs24h);
return AjaxResult.success(dto);
}
@Override
public AjaxResult getHashRateHistory(AccountDateVo vo) {
System.out.println(vo);
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
return AjaxResult.error("coin error");
}
Date today = new Date();
today.setHours(0);
today.setMinutes(0);
today.setMinutes(0);
Calendar ca = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
ca.setTime(today);
ca.add(Calendar.MONTH,-3);
Date firstDate = ca.getTime();
if (StringUtils.isBlank(vo.getStart())){
vo.setStart(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,firstDate));
}else {
if(DateUtils.parseDate(vo.getStart()).before(firstDate)){
vo.setStart(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,firstDate));
}else {
//在三个月之内 不做处理
try {
DateUtils.parseDate(vo.getStart());
}catch (Exception e){
//出错说明格式错误有
return AjaxResult.error("start param error");
}
}
}
if (StringUtils.isNotBlank(vo.getEnd())){
//在三个月之内 不做处理
try {
Date end = DateUtils.parseDate(vo.getEnd());
if(end.before(DateUtils.parseDate(vo.getStart()))){
//end时间在start之前
return AjaxResult.error("end Date can not before start Date");
}
if(firstDate.before(end)){
return AjaxResult.error("end Date can not before "+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,firstDate));
}
}catch (Exception e){
//出错说明格式错误有
return AjaxResult.error("end param error");
}
}else {
//没有end 则不做处理
}
List<HashRateDto> mhsList = accountMapperMapper.getAccountHashRateHistory24hListByCoinAndAccount(vo);
HashRateHistory24hDto dto = new HashRateHistory24hDto();
dto.setList(mhsList);
dto.setUnit(unit.getUnit());
return AjaxResult.success(dto);
}
@Override
public AjaxResult getHashRateLast24h(AccountVo vo) {
long t0 = System.currentTimeMillis();
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
return AjaxResult.error("coin error");
}
Date today = new Date();
Calendar ca = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
ca.setTime(today);
ca.add(Calendar.DATE,-1);
String start = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,ca.getTime());
long t1 = System.currentTimeMillis();
List<HashRateDto> list = accountMapperMapper.getAccountHashRateHistory30mListByCoinAndAccount(vo, start);
long t2 = System.currentTimeMillis();
HashRateHistory30mDto dto = new HashRateHistory30mDto();
dto.setList(list);
dto.setUnit(unit.getUnit());
System.out.println("挖矿账户last24h业务 数据库查询耗时:"+(t2-t1)+"ms,业务耗时"+(t2-t0)+"ms");
return AjaxResult.success(dto);
}
@Override
public AjaxResult getMinersList(AccountVo vo) {
List<MinerState> list = accountMapperMapper.getMinerListByCoinAndAccount(vo);
List<MinerStateDto> minerList = list.stream().map(e -> {
MinerStateDto dto = new MinerStateDto();
dto.setMiner(e.getMiner());
if ("online".equals(e.getState().toLowerCase())) {
dto.setState(0);
} else if ("offline".equals(e.getState().toLowerCase())) {
dto.setState(1);
} else {
dto.setState(2);
}
return dto;
}).collect(Collectors.toList());
MinerStateListDto minerStateListDto = new MinerStateListDto();
minerStateListDto.setList(minerList);
return AjaxResult.success(minerStateListDto);
}
@Override
public AjaxResult getWatch(AccountVo vo) {
MinerWatchDto dto = new MinerWatchDto();
List<MinerState> list = accountMapperMapper.getMinerListByCoinAndAccount(vo);
Map<String, Long> map = list.stream().collect(Collectors.groupingBy(
MinerState::getState,
Collectors.counting()
));
long total = Convert.toLong(list.size(),0L);
long online = map.getOrDefault("online", 0L);
long offline = map.getOrDefault("offline", 0L);
dto.setTotal(total);
dto.setOnline(online);
dto.setOffline(offline);
dto.setTimeout(BigDecimal.valueOf(total)
.subtract(BigDecimal.valueOf(online))
.subtract(BigDecimal.valueOf(offline))
.longValue());
return AjaxResult.success(dto);
}
}

View File

@@ -0,0 +1,138 @@
package com.m2pool.oapi.service.impl;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.m2pool.common.core.utils.DateUtils;
import com.m2pool.common.core.utils.StringUtils;
import com.m2pool.common.core.web.Result.AjaxResult;
import com.m2pool.oapi.dto.HashRateDto;
import com.m2pool.oapi.dto.HashRateHistory24hDto;
import com.m2pool.oapi.dto.HashRateHistory30mDto;
import com.m2pool.oapi.dto.HashRateRealDto;
import com.m2pool.oapi.enums.PoolUnits;
import com.m2pool.oapi.mapper.MinerMapper;
import com.m2pool.oapi.service.MinerService;
import com.m2pool.oapi.utils.EnumUtils;
import com.m2pool.oapi.vo.AccountMinerDateVo;
import com.m2pool.oapi.vo.AccountMinerVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
/**
* @Description TODO
* @Date 2024/9/13 10:49
* @Author 杜懿
*/
@Service
public class MinerServiceImpl implements MinerService {
@Autowired
private MinerMapper minerMapper;
@Override
public AjaxResult getHashRateReal(AccountMinerVo vo) {
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
return AjaxResult.error("coin error");
}
HashRateRealDto dto = minerMapper.getMinerRealHashRateByCoinAndAccountMiner(vo);
dto.setUnit(unit.getUnit());
return AjaxResult.success(dto);
}
@Override
public AjaxResult getHashRateHistory(AccountMinerDateVo vo) {
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
return AjaxResult.error("coin error");
}
Date today = new Date();
today.setHours(0);
today.setMinutes(0);
today.setMinutes(0);
Calendar ca = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
ca.setTime(today);
ca.add(Calendar.MONTH,-3);
Date firstDate = ca.getTime();
if (StringUtils.isBlank(vo.getStart())){
vo.setStart(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,firstDate));
}else {
if(DateUtils.parseDate(vo.getStart()).before(firstDate)){
vo.setStart(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,firstDate));
}else {
//在三个月之内 不做处理
try {
DateUtils.parseDate(vo.getStart());
}catch (Exception e){
//出错说明格式错误有
return AjaxResult.error("start param error");
}
}
}
if (StringUtils.isNotBlank(vo.getEnd())){
//在三个月之内 不做处理
try {
Date end = DateUtils.parseDate(vo.getEnd());
if(end.before(DateUtils.parseDate(vo.getStart()))){
//end时间在start之前
return AjaxResult.error("end Date can not before start Date");
}
if(firstDate.before(end)){
return AjaxResult.error("end Date can not before "+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,firstDate));
}
}catch (Exception e){
//出错说明格式错误有
return AjaxResult.error("end param error");
}
}else {
//没有end 则不做处理
}
List<HashRateDto> mhsList = minerMapper.getMinerHashRateHistory24hListByCoinAndAccountMiner(vo);
HashRateHistory24hDto dto = new HashRateHistory24hDto();
dto.setList(mhsList);
dto.setUnit(unit.getUnit());
return AjaxResult.success(dto);
}
@Override
public AjaxResult getHashRateLast24h(AccountMinerVo vo) {
long t0 = System.currentTimeMillis();
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
return AjaxResult.error("coin error");
}
Date today = new Date();
Calendar ca = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
ca.setTime(today);
ca.add(Calendar.DATE,-1);
String start = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,ca.getTime());
long t1 = System.currentTimeMillis();
List<HashRateDto> list = minerMapper.getMinerHashRateHistory30mListByCoinAndAccountMiner(vo, start);
long t2 = System.currentTimeMillis();
HashRateHistory30mDto dto = new HashRateHistory30mDto();
dto.setList(list);
dto.setUnit(unit.getUnit());
long t3 = System.currentTimeMillis();
return AjaxResult.success(dto);
}
}

View File

@@ -0,0 +1,213 @@
package com.m2pool.oapi.service.impl;
import com.m2pool.common.core.text.Convert;
import com.m2pool.common.core.utils.DateUtils;
import com.m2pool.common.core.utils.StringUtils;
import com.m2pool.common.core.web.Result.AjaxResult;
import com.m2pool.oapi.dto.*;
import com.m2pool.oapi.entity.MinerState;
import com.m2pool.oapi.enums.PoolAmount;
import com.m2pool.oapi.enums.PoolUnits;
import com.m2pool.oapi.mapper.PoolMapper;
import com.m2pool.oapi.service.PoolService;
import com.m2pool.oapi.utils.EnumUtils;
import com.m2pool.oapi.vo.CoinVo;
import com.m2pool.oapi.vo.DateVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description TODO
* @Date 2024/9/13 10:44
* @Author 杜懿
*/
@Service
public class PoolServiceImpl implements PoolService {
@Autowired
private PoolMapper poolMapper;
@Override
public AjaxResult getHashRate(CoinVo vo) {
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
return AjaxResult.error("coin error");
}
HashRateRealDto dto = poolMapper.getPoolRealHashRateListByCoin(vo);
dto.setUnit(unit.getUnit());
return AjaxResult.success(dto);
}
@Override
public AjaxResult getHashRateHistory(DateVo vo) {
if(StringUtils.isNull(vo)){
return AjaxResult.error("request body cannot be null");
}
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
return AjaxResult.error("coin error");
}
Date today = new Date();
today.setHours(0);
today.setMinutes(0);
today.setMinutes(0);
Calendar ca = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
ca.setTime(today);
ca.add(Calendar.MONTH,-3);
//只允许查询当前日期之前3个月的记录 所以firstDate代表运行查询是最早时间值
Date firstDate = ca.getTime();
//用start保存最开始用户传入的开始时间 没传start或者错误格式都会导致start为null 后续可以根据start是否为空判断是否有正确传入开始时间
Date start = DateUtils.parseDate(vo.getStart());
Date end = DateUtils.parseDate(vo.getEnd());
if (StringUtils.isNotNull(end)){
//在三个月之内 不做处理
if(StringUtils.isNull(start)){
//用户没传start 只需比较end 和 firsrDate
if(end.before(firstDate) || end.equals(firstDate)){
return AjaxResult.error("end Date can not before "+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,firstDate));
}
//end 在firstDate之后 符合条件 可以进入后续步骤
}else {
//用户传了 start 此时有start 和 end以及firstDate 需要优先比较这两个start和end是否符合 start before end
if(end.before(start) || end.equals(start)){
return AjaxResult.error("end Date must after start Date");
}else {
//start before end 此时可能的时间顺序有 1、firstDate start end 2、start firstDate end 3、 start end firstDate
//第一种情况则正常按用户传的start、end查询 即不做处理
//第二种情况则设vo.start为firstDate
//第三种情况提示 end 不能在firstDate之前
if(start.before(firstDate)){
//满足次条件的只有2和3 3会在后面进行拦截 所以此处不用处理
//处理第二种情况
vo.setStart(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,firstDate));
}
//执行到这里只有1、修正了时间的2 以及3
if(end.before(firstDate)){
//
return AjaxResult.error("end Date can not before "+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,firstDate));
}
}
}
}else {
//没有end
if(StringUtils.isNotNull(start) && firstDate.before(start)){
//只有用户传入了正确格式的开始时间 并且这个时间在firstDate之后才不用修改vo.start 否则都需要设置vo.start为firstDate
}else {
vo.setStart(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,firstDate));
}
}
List<HashRateDto> mhs24hList = poolMapper.getPoolHashRateHistory24hListByCoin(vo);
List<HashRateDto> mhs30mList = poolMapper.getPoolHashRateHistory30mListByCoin(vo);
PoolHashRateHistoryDto dto = new PoolHashRateHistoryDto();
dto.setMhs24hList(mhs24hList);
dto.setMhsList(mhs30mList);
dto.setUnit(unit.getUnit());
return AjaxResult.success(dto);
}
@Override
public AjaxResult getMinersList(CoinVo vo) {
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
//防止coin注入异常数据
return AjaxResult.error("coin error");
}
MinerWatchDto dto = new MinerWatchDto();
List<MinerState> list = poolMapper.getMinerListByCoin(vo);
Map<String, Long> map = list.stream().collect(Collectors.groupingBy(
MinerState::getState,
Collectors.counting()
));
long total = Convert.toLong(list.size(),0L);
long online = map.getOrDefault("online", 0L);
long offline = map.getOrDefault("offline", 0L);
dto.setTotal(total);
dto.setOnline(online);
dto.setOffline(offline);
dto.setTimeout(BigDecimal.valueOf(total)
.subtract(BigDecimal.valueOf(online))
.subtract(BigDecimal.valueOf(offline))
.longValue());
return AjaxResult.success(dto);
}
@Override
public AjaxResult getWatch(CoinVo vo) {
PoolUnits unit = (PoolUnits) EnumUtils.get(PoolUnits.class, vo.getCoin());
if(StringUtils.isNull(unit)){
//防止coin注入异常数据
return AjaxResult.error("coin error");
}
PoolAmount poolAmount = (PoolAmount) EnumUtils.get(PoolAmount.class, vo.getCoin());
if(StringUtils.isNull(poolAmount)){
//防止coin注入异常数据
return AjaxResult.error("coin error");
}
PoolWatchDto watch = poolMapper.getPoolWatchByCoin(vo);
if(StringUtils.isNull(watch)){
watch = new PoolWatchDto();
watch.setMiners(0);
watch.setMhs(BigDecimal.ZERO);
watch.setHeight(0);
}
//todo 加到配置文件中
int fee = 1;
if("enx".equals(vo.getCoin())){
Date now =new Date();
if(now.before(DateUtils.parseDate("2025-04-21"))){{
fee =0;
}}
}
watch.setFee(fee+"% PPLNS");
watch.setMinPay(poolAmount.getAmount());
DateVo dateVo = new DateVo();
dateVo.setCoin(vo.coin);
//Date today = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getDate());
Date today = DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getDate()+" 00:00:00");
Calendar ca = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
ca.setTime(today);
ca.add(Calendar.DATE,-7);
Date start = ca.getTime();
dateVo.setStart(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,start));
List<HashRateDto> list = poolMapper.getPoolHashRateHistory24hListByCoin(dateVo);
list.stream().forEach(e -> {
e.setDate(DateUtils.addDays(e.getDate(),-1));
//MH/s 每秒转GH/s
//e.setPv(e.getPv().divide(BigDecimal.valueOf(1000),scale,BigDecimal.ROUND_HALF_UP).stripTrailingZeros());
});
//最后一条用实时表最新一组数据 字段mhs24h对应实时24h算力
HashRateDto lastDto = poolMapper.getPoolRealHashRateByCoin(vo);
Date now = DateUtils.parseDate(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD));
lastDto.setDate(now);
list.add(lastDto);
watch.setList(list);
watch.setUnit(unit.getUnit());
return AjaxResult.success(watch);
}
}

View File

@@ -0,0 +1,99 @@
package com.m2pool.oapi.utils;
import com.m2pool.common.core.utils.StringUtils;
import java.lang.reflect.Method;
/**
* @Description 枚举工具类
* @Date 2024/6/13 10:54
* @Author dy
*/
public class EnumUtils {
/**
* 通过值判断数值是否属于枚举类的值
* @param clzz 枚举类 Enum
* @param code
* @author wayleung
* @return
*/
public static boolean isInclude(Class<?> clzz,String code){
if(StringUtils.isEmpty(code)){
return false;
}
try {
if(clzz.isEnum()){
Object[] enumConstants = clzz.getEnumConstants();
Method name = clzz.getMethod("name");
for (Object enumConstant:enumConstants){
if (name.invoke(enumConstant).equals(code.toUpperCase())) {
return true;
}
}
}
}catch (Exception e){
throw new RuntimeException();
}
return false;
}
/**
* 通过值判断数值是否属于枚举类的值
* @param clzz 枚举类 Enum
* @param code
* @author wayleung
* @return
*/
public static Object get(Class<?> clzz,String code){
if(StringUtils.isEmpty(code)){
return null;
}
try {
if(clzz.isEnum()){
Object[] enumConstants = clzz.getEnumConstants();
Method getInfo = clzz.getMethod("name");
for (Object enumConstant:enumConstants){
if (getInfo.invoke(enumConstant).equals(code.toUpperCase())) {
return enumConstant;
}
}
}
}catch (Exception e){
throw new RuntimeException();
}
return null;
}
public static String getNumberTypeStr(Class<?> clzz,String value){
if(StringUtils.isEmpty(value)){
return null;
}
try {
if(clzz.isEnum()){
Object[] enumConstants = clzz.getEnumConstants();
Method getInfo = clzz.getMethod("getInfo");
Method getValue = clzz.getMethod("getValue");
for (Object enumConstant:enumConstants){
if (getInfo.invoke(enumConstant).equals(value)) {
return (String) getValue.invoke(enumConstant);
}
}
}
}catch (Exception e){
throw new RuntimeException();
}
return null;
}
}

View File

@@ -0,0 +1,32 @@
package com.m2pool.oapi.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.m2pool.common.core.xss.Xss;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @Description TODO
* @Date 2024/9/12 15:49
* @Author 杜懿
*/
@Data
public class AccountDateVo {
@NotBlank(message = "矿工账号不能为空")
@Xss
@JsonProperty("mining_user")
@JSONField(name = "mining_user")
public String ma;
@Xss
public String coin;
@Xss
public String start;
@Xss
public String end;
}

View File

@@ -0,0 +1,36 @@
package com.m2pool.oapi.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.m2pool.common.core.xss.Xss;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @Description TODO
* @Date 2024/9/12 15:49
* @Author 杜懿
*/
@Data
public class AccountMinerDateVo {
@NotBlank(message = "矿工账号不能为空")
@Xss
@JsonProperty("mining_user")
@JSONField(name = "mining_user")
public String ma;
@NotBlank(message = "矿机号不能为空")
@Xss
public String miner;
@Xss
public String coin;
@Xss
public String start;
@Xss
public String end;
}

View File

@@ -0,0 +1,30 @@
package com.m2pool.oapi.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.m2pool.common.core.xss.Xss;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @Description TODO
* @Date 2024/9/12 15:49
* @Author 杜懿
*/
@Data
public class AccountMinerVo {
@NotBlank(message = "矿工账号不能为空")
@Xss
@JsonProperty("mining_user")
@JSONField(name = "mining_user")
public String ma;
@Xss
public String coin;
@NotBlank(message = "矿机号不能为空")
@Xss
public String miner;
}

View File

@@ -0,0 +1,26 @@
package com.m2pool.oapi.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.m2pool.common.core.xss.Xss;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @Description TODO
* @Date 2024/9/12 15:49
* @Author 杜懿
*/
@Data
public class AccountVo {
@NotBlank(message = "矿工账号不能为空")
@Xss
@JsonProperty("mining_user")
@JSONField(name = "mining_user")
public String ma;
@Xss
public String coin;
}

View File

@@ -0,0 +1,16 @@
package com.m2pool.oapi.vo;
import com.m2pool.common.core.xss.Xss;
import lombok.Data;
/**
* @Description TODO
* @Date 2024/9/12 15:49
* @Author 杜懿
*/
@Data
public class CoinVo {
@Xss
public String coin;
}

View File

@@ -0,0 +1,24 @@
package com.m2pool.oapi.vo;
import com.m2pool.common.core.xss.Xss;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @Description TODO
* @Date 2024/9/12 15:49
* @Author 杜懿
*/
@Data
public class DateVo {
@Xss
public String start;
@Xss
public String end;
@Xss
public String coin;
}

View File

@@ -0,0 +1,156 @@
server:
port: 9207
compression:
enabled: true
mime-types: application/json
spring:
#邮箱基本配置
mail:
# 配置在limit_time内用户可以发送limit次验证码
limit: 2 这个是我额外的配置,结合邮箱服务用的
limitTime: 10 这个是我额外的配置
#配置smtp服务主机地址
# sina smtp.sina.cn
# aliyun smtp.aliyun.com
# 163 smtp.163.com 端口号465或994
host: mail.privateemail.com
#发送者邮箱
username: support@m2pool.cc
#配置密码,注意不是真正的密码,而是刚刚申请到的授权码
# password:
# password: m2pool2024@!
# password: axvm-zfgx-cgcg-qhhu
password: m2pool2024@!
#端口号
port: 587
#默认的邮件编码为UTF-8
default-encoding: UTF-8
#其他参数
properties:
mail:
#配置SSL 加密工厂
smtp:
ssl:
#本地测试先放开ssl
enable: false
required: false
#开启debug模式这样邮件发送过程的日志会在控制台打印出来方便排查错误
debug: false
socketFactory:
class: javax.net.ssl.SSLSocketFactory
application:
# 应用名称
name: m2pool-oapi
profiles:
# 环境配置
active: prod
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8808
namespace: m2_prod
group: m2_prod_group
# server-addr: 127.0.0.1:8808
config:
# 配置中心地址
server-addr: 127.0.0.1:8808
# server-addr: 127.0.0.1:8808
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
namespace: m2_prod
group: m2_prod_group
servlet:
multipart:
max-file-size: 2MB
max-request-size: 8MB
myenv:
domain: https://www.m2pool.com
path: /var/www/html/web
img: /img
##测试环境
#server:
# port: 9507
# compression:
# enabled: true
# mime-types: application/json
#
#spring:
# #邮箱基本配置
# mail:
# # 配置在limit_time内用户可以发送limit次验证码
# limit: 2 这个是我额外的配置,结合邮箱服务用的
# limitTime: 10 这个是我额外的配置
# #配置smtp服务主机地址
# # sina smtp.sina.cn
# # aliyun smtp.aliyun.com
# # 163 smtp.163.com 端口号465或994
# host: mail.privateemail.com
# #发送者邮箱
# username: support@m2pool.cc
# #配置密码,注意不是真正的密码,而是刚刚申请到的授权码
# # password:
# # password: m2pool2024@!
# # password: axvm-zfgx-cgcg-qhhu
# password: m2pool2024@!
# #端口号
# port: 587
# #默认的邮件编码为UTF-8
# default-encoding: UTF-8
# #其他参数
# properties:
# mail:
# #配置SSL 加密工厂
# smtp:
# ssl:
# #本地测试先放开ssl
# enable: false
# required: false
# #开启debug模式这样邮件发送过程的日志会在控制台打印出来方便排查错误
# debug: false
# socketFactory:
# class: javax.net.ssl.SSLSocketFactory
#
# application:
# # 应用名称
# name: m2pool-oapi
# profiles:
# # 环境配置
# active: test
# cloud:
# nacos:
# discovery:
# # 服务注册地址
# server-addr: 127.0.0.1:8808
# namespace: m2_test
# group: m2_test_group
# # server-addr: 127.0.0.1:8808
# config:
# # 配置中心地址
# server-addr: 127.0.0.1:8808
# # server-addr: 127.0.0.1:8808
# # 配置文件格式
# file-extension: yml
# # 共享配置
# shared-configs:
# - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# namespace: m2_test
# group: m2_test_group
# servlet:
# multipart:
# max-file-size: 2MB
# max-request-size: 8MB
#
#myenv:
# domain: https://test.m2pool.com
# path: /var/www/html/web_test
# img: /img

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/m2pool-oapi" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.m2pool" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
</configuration>

View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.m2pool.oapi.mapper.AccountMapper">
<select id="getAccountRealHashRateListByCoinAndAccount" resultType="com.m2pool.oapi.dto.HashRateRealDto">
select
mhs30m mhs,
mhs24h
from
${vo.coin}_mhs_realv2
where
`user` = '${vo.ma}'
</select>
<select id="getAccountHashRateHistory24hListByCoinAndAccount" resultType="com.m2pool.oapi.dto.HashRateDto">
select
`date`,
mhs
from
${vo.coin}_users_24h
<where>
`user` = '${vo.ma}'
<if test="vo.start != null and vo.start != ''">
and `date` &gt; "${vo.start}"
</if>
<if test="vo.end != null and vo.end != ''">
and `date` &lt;= "${vo.end}"
</if>
</where>
order by date
</select>
<select id="getAccountHashRateHistory30mListByCoinAndAccount" resultType="com.m2pool.oapi.dto.HashRateDto">
select
`date`,
mhs
from
${vo.coin}_users_30m
where
`user` = '${vo.ma}'
and `date` &gt; "${start}"
order by date
</select>
<select id="getMinerListByCoinAndAccount" resultType="com.m2pool.oapi.entity.MinerState">
select
miner,
`state`
from
${vo.coin}_mhs_realv2
where
`user` = '${vo.ma}'
</select>
</mapper>

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.m2pool.oapi.mapper.MinerMapper">
<select id="getMinerRealHashRateByCoinAndAccountMiner" resultType="com.m2pool.oapi.dto.HashRateRealDto">
select
mhs30m mhs,
mhs24h
from
${vo.coin}_mhs_realv2
where
`user` = '${vo.ma}' and miner= '${vo.miner}'
order by date desc limit 1
</select>
<select id="getMinerHashRateHistory24hListByCoinAndAccountMiner"
resultType="com.m2pool.oapi.dto.HashRateDto">
select
`date`,
mhs
from
${vo.coin}_mhs24h
<where>
`user` = '${vo.ma}'
and miner = '${vo.miner}'
<if test="vo.start != null and vo.start != ''">
and `date` &gt; "${vo.start}"
</if>
<if test="vo.end != null and vo.end != ''">
and `date` &lt;= "${vo.end}"
</if>
</where>
order by date
</select>
<select id="getMinerHashRateHistory30mListByCoinAndAccountMiner"
resultType="com.m2pool.oapi.dto.HashRateDto">
select
`date`,
mhs
from
${vo.coin}_mhs30m
where
`user` = '${vo.ma}'
and miner = '${vo.miner}'
and `date` &gt; "${start}"
order by date
</select>
</mapper>

View File

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.m2pool.oapi.mapper.PoolMapper">
<select id="getPoolRealHashRateListByCoin" resultType="com.m2pool.oapi.dto.HashRateRealDto">
select
sum(mhs30m) mhs,
sum(mhs24h) mhs24h
from
${vo.coin}_mhs_realv2
</select>
<select id="getPoolHashRateHistory24hListByCoin" resultType="com.m2pool.oapi.dto.HashRateDto">
select
`date`,
mhs
from
${vo.coin}_pool_24h
<where>
<if test="vo.start != null and vo.start != ''">
and `date` &gt; "${vo.start}"
</if>
<if test="vo.end != null and vo.end != ''">
and `date` &lt;= "${vo.end}"
</if>
</where>
order by date
</select>
<select id="getPoolHashRateHistory30mListByCoin" resultType="com.m2pool.oapi.dto.HashRateDto">
select
`date`,
mhs
from
${vo.coin}_pool_30m
<where>
<if test="vo.start != null and vo.start != ''">
and `date` &gt; "${vo.start}"
</if>
<if test="vo.end != null and vo.end != ''">
and `date` &lt;= "${vo.end}"
</if>
</where>
order by date
</select>
<select id="getMinerListByCoin" resultType="com.m2pool.oapi.entity.MinerState">
select
miner,
`state`
from
${vo.coin}_mhs_realv2
</select>
<select id="getPoolWatchByCoin" resultType="com.m2pool.oapi.dto.PoolWatchDto">
select
sum(mhs24h) mhs,
count(case when state='online' then 1 END) as miners,
(select height from distribution.${vo.coin}_blkreportprofitv2 order by date desc limit 1) as height
from
${vo.coin}_mhs_realv2 limit 1
</select>
<select id="getPoolRealHashRateByCoin" resultType="com.m2pool.oapi.dto.HashRateDto">
select `date`,sum(mhs24h) mhs from ${vo.coin}_mhs_realv2 group by date order by date desc limit 1
</select>
</mapper>