wzy
2020-05-18 f2b9c03ba8c733a183e3568d85038e9a87f84e82
add register interface code
9 files modified
12 files added
450 ■■■■■ changed files
src/main/java/com/xcong/excoin/common/contants/AppContants.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/common/enumerates/CoinTypeEnum.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/common/enumerates/SymbolEnum.java 29 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/common/system/dto/RegisterDto.java 2 ●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberLevelRateDao.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletAgentDao.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java 10 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletContractDao.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/entity/MemberLevelRateEntity.java 36 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletAgentEntity.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/MemberService.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java 133 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/utils/ShareCodeUtil.java 118 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberDao.xml 4 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberLevelRateDao.xml 5 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberWalletAgentDao.xml 6 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberWalletCoinDao.xml 7 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/member/MemberWalletContractDao.xml 6 ●●●●● patch | view | raw | blame | history
src/test/java/com/xcong/excoin/KssframeworkApplicationTests.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/com/xcong/excoin/common/contants/AppContants.java
@@ -1,5 +1,7 @@
package com.xcong.excoin.common.contants;
import java.math.BigDecimal;
/**
 * @author wzy
 * @date 2020-05-12
@@ -37,4 +39,14 @@
     */
    public static final String ACCOUNT_TYPE_EMAIL = "2";
    /**
     * 系统推荐人id
     */
    public static final String SYSTEM_REFERER = "rxadr3";
    /**
     * 初始化金额
     */
    public static final BigDecimal INIT_MONEY = new BigDecimal(0.000000);
}
src/main/java/com/xcong/excoin/common/enumerates/CoinTypeEnum.java
New file
@@ -0,0 +1,10 @@
package com.xcong.excoin.common.enumerates;
/**
 * 币种枚举数据
 *
 * @author wzy
 */
public enum CoinTypeEnum {
    USDT, BTC, ETH, LTC, EOS, XRP, BCH, ETC
}
src/main/java/com/xcong/excoin/common/enumerates/SymbolEnum.java
New file
@@ -0,0 +1,29 @@
package com.xcong.excoin.common.enumerates;
import lombok.Getter;
/**
 * @author wzy
 */
@Getter
public enum SymbolEnum {
    BTC("BTC", "BTC/USDT")
    ,ETH("ETH", "ETH/USDT")
    ,LTC("LTC", "LTC/USDT")
    ,BCH("BCH", "BCH/USDT")
    ,EOS("EOS", "EOS/USDT")
    ,XRP("XRP", "XRP/USDT")
    ,ETC("ETC", "ETC/USDT");
    private String name;
    private String value;
    private SymbolEnum(String name, String value) {
        this.name = name;
        this.value = value;
    }
}
src/main/java/com/xcong/excoin/common/system/dto/RegisterDto.java
@@ -27,7 +27,7 @@
    @ApiModelProperty(value = "账号类型", notes = "1-手机 2-邮箱", example = "1")
    @NotBlank(message = "账号类型不能为空")
    private String type;
    private Integer type;
    @ApiModelProperty(value = "验证码", example = "123456")
    @NotBlank(message = "验证码不能为空")
src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
@@ -10,4 +10,6 @@
public interface MemberDao extends BaseMapper<MemberEntity> {
    public MemberEntity selectMemberInfoByAccount(@Param("account") String account);
    public MemberEntity selectMemberInfoByRefererId(@Param("refererId") String refererId);
}
src/main/java/com/xcong/excoin/modules/member/dao/MemberLevelRateDao.java
New file
@@ -0,0 +1,7 @@
package com.xcong.excoin.modules.member.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.member.entity.MemberLevelRateEntity;
public interface MemberLevelRateDao extends BaseMapper<MemberLevelRateEntity> {
}
src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletAgentDao.java
New file
@@ -0,0 +1,7 @@
package com.xcong.excoin.modules.member.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.member.entity.MemberWalletAgentEntity;
public interface MemberWalletAgentDao extends BaseMapper<MemberWalletAgentEntity> {
}
src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletCoinDao.java
New file
@@ -0,0 +1,10 @@
package com.xcong.excoin.modules.member.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.member.entity.MemberWalletCoinEntity;
/**
 * @author wzy
 */
public interface MemberWalletCoinDao extends BaseMapper<MemberWalletCoinEntity> {
}
src/main/java/com/xcong/excoin/modules/member/dao/MemberWalletContractDao.java
New file
@@ -0,0 +1,7 @@
package com.xcong.excoin.modules.member.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcong.excoin.modules.member.entity.MemberWalletContractEntity;
public interface MemberWalletContractDao extends BaseMapper<MemberWalletContractEntity> {
}
src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java
@@ -27,6 +27,34 @@
    public static final Integer ACCOUNT_STATUS_ENABLE = 1;
    /**
     * 账号代理级别
     */
    public static final Integer ACCOUNT_AGENT_LEVEL = 6;
    /**
     * 账号类型 手机
     */
    public static final Integer ACCOUNT_TYPE_PHONE = 1;
    /**
     * 账号类型 邮箱
     */
    public static final Integer ACCOUNT_TYPE_EMAIL = 2;
    /**
     * 实名认证 审核通过
     */
    public static final Integer CERTIFY_STATUS_Y = 1;
    /**
     * 实名认证 审核不通过
     */
    public static final Integer CERTIFY_STATUS_N = 0;
    /**
     * 实名认证 审核中
     */
    public static final Integer CERTIFY_STATUS_ING = 2;
    /**
     * 手机号(包含国际手机号)
     */
    private String phone;
src/main/java/com/xcong/excoin/modules/member/entity/MemberLevelRateEntity.java
New file
@@ -0,0 +1,36 @@
package com.xcong.excoin.modules.member.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xcong.excoin.common.system.base.BaseEntity;
import lombok.Data;
/**
 * 用户杠杆设置表
 *
 * @Author wzy
 * @Date 2020/5/18
 **/
@Data
@TableName("member_level_rate")
public class MemberLevelRateEntity extends BaseEntity {
    /**
     * 会员ID
     */
    private Long memberId;
    /**
     * 多头杠杆
     */
    private int levelRateUp = 100;
    /**
     * 空头杠杆
     */
    private int levelRateDown = 100;
    /**
     * 币种
     */
    private String symbol;
}
src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletAgentEntity.java
@@ -1,6 +1,7 @@
package com.xcong.excoin.modules.member.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.common.system.base.BaseEntity;
import lombok.Data;
@@ -24,22 +25,22 @@
    /**
     * 可用余额
     */
    private BigDecimal availableBalance;
    private BigDecimal availableBalance = AppContants.INIT_MONEY;
    /**
     * 总金额
     */
    private BigDecimal totalBalance;
    private BigDecimal totalBalance = AppContants.INIT_MONEY;
    /**
     * 冻结金额
     */
    private BigDecimal frozenBalance;
    private BigDecimal frozenBalance = AppContants.INIT_MONEY;
    /**
     * 借入资产金额
     */
    private BigDecimal borrowedFund;
    private BigDecimal borrowedFund = AppContants.INIT_MONEY;
    /**
     * 钱包标识
src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
@@ -1,6 +1,8 @@
package com.xcong.excoin.modules.member.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.common.system.dto.RegisterDto;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.modules.test.entity.TestUserEntity;
@@ -8,4 +10,7 @@
 * @author wzy
 */
public interface MemberService extends IService<MemberEntity> {
    public Result register(RegisterDto registerDto);
}
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -1,13 +1,142 @@
package com.xcong.excoin.modules.member.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.Sign;
import cn.hutool.crypto.asymmetric.SignAlgorithm;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xcong.excoin.modules.member.dao.MemberDao;
import com.xcong.excoin.modules.member.entity.MemberEntity;
import com.xcong.excoin.common.contants.AppContants;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
import com.xcong.excoin.common.enumerates.SymbolEnum;
import com.xcong.excoin.common.response.Result;
import com.xcong.excoin.common.system.dto.RegisterDto;
import com.xcong.excoin.modules.member.dao.*;
import com.xcong.excoin.modules.member.entity.*;
import com.xcong.excoin.modules.member.service.MemberService;
import com.xcong.excoin.utils.ShareCodeUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
/**
 * @author wzy
 * @date 2020-05-18
 **/
@Service
public class MemberServiceImpl extends ServiceImpl<MemberDao, MemberEntity> implements MemberService {
    @Resource
    private MemberDao memberDao;
    @Resource
    private MemberWalletAgentDao memberWalletAgentDao;
    @Resource
    private MemberWalletContractDao memberWalletContractDao;
    @Resource
    private MemberWalletCoinDao memberWalletCoinDao;
    @Resource
    private MemberLevelRateDao memberLevelRateDao;
    @Transactional()
    @Override
    public Result register(RegisterDto registerDto) {
        // 查询是否存在该账号用户
        MemberEntity member = memberDao.selectMemberInfoByAccount(registerDto.getAccount());
        if (member == null) {
            return Result.fail("账号已存在");
        }
        member = new MemberEntity();
        Sign sign = SecureUtil.sign(SignAlgorithm.MD5withRSA);
        byte[] signByte = sign.sign(registerDto.getPassword().getBytes());
        member.setPassword(new String(signByte));
        // 判断账号类型
        if (MemberEntity.ACCOUNT_TYPE_PHONE == registerDto.getType()) {
            member.setPhone(registerDto.getAccount());
        } else if (MemberEntity.ACCOUNT_TYPE_EMAIL == registerDto.getType()) {
            member.setEmail(registerDto.getAccount());
        } else {
            return Result.fail("账号类型错误");
        }
        // 判断是否拥有推荐人,若为空则默认系统
        if (StrUtil.isBlank(registerDto.getRefererId())) {
            registerDto.setRefererId(AppContants.SYSTEM_REFERER);
        }
        member.setRefererId(registerDto.getRefererId());
        member.setAccountStatus(MemberEntity.ACCOUNT_STATUS_ENABLE);
        member.setAccountType(registerDto.getType());
        member.setAgentLevel(MemberEntity.ACCOUNT_AGENT_LEVEL);
        member.setCertifyStatus(MemberEntity.CERTIFY_STATUS_ING);
        member.setIsForce(0);
        member.setIsProfit(0);
        memberDao.insert(member);
        String inviteId = ShareCodeUtil.toSerialCode(member.getId());
        member.setInviteId(inviteId);
        boolean flag = false;
        String parentId = member.getRefererId();
        String ids = "";
        while (!flag) {
            ids += ("," + parentId);
            MemberEntity parentMember = memberDao.selectMemberInfoByRefererId(parentId);
            if (parentMember == null) {
                break;
            }
            parentId = parentMember.getRefererId();
            if (parentMember.getRefererId().equals(parentMember.getInviteId())) {
                flag = true;
            }
        }
        member.setRefererIds(ids);
        memberDao.updateById(member);
        //初始化合约钱包
        MemberWalletContractEntity walletContract = new MemberWalletContractEntity();
        walletContract.setMemberId(member.getId());
        walletContract.setAvailableBalance(AppContants.INIT_MONEY);
        walletContract.setFrozenBalance(AppContants.INIT_MONEY);
        walletContract.setTotalBalance(AppContants.INIT_MONEY);
        walletContract.setBorrowedFund(AppContants.INIT_MONEY);
        walletContract.setWalletCode(CoinTypeEnum.USDT.name());
        memberWalletContractDao.insert(walletContract);
        // 初始化币币钱包
        for (CoinTypeEnum coinTypeEnum : CoinTypeEnum.values()) {
            MemberWalletCoinEntity walletCoin = new MemberWalletCoinEntity();
            walletCoin.setWalletCode(coinTypeEnum.name());
            walletCoin.setMemberId(member.getId());
            walletCoin.setAvailableBalance(AppContants.INIT_MONEY);
            walletCoin.setFrozenBalance(AppContants.INIT_MONEY);
            walletCoin.setTotalBalance(AppContants.INIT_MONEY);
            walletCoin.setBorrowedFund(AppContants.INIT_MONEY);
            memberWalletCoinDao.insert(walletCoin);
        }
        // 初始化代理佣金钱包
        MemberWalletAgentEntity walletAgent = new MemberWalletAgentEntity();
        walletAgent.setMemberId(member.getId());
        walletAgent.setWalletCode(CoinTypeEnum.USDT.name());
        memberWalletAgentDao.insert(walletAgent);
        // 初始化杠杆
        for(SymbolEnum symbolEnum : SymbolEnum.values()) {
            MemberLevelRateEntity levelRate = new MemberLevelRateEntity();
            levelRate.setMemberId(member.getId());
            levelRate.setSymbol(symbolEnum.getValue());
            memberLevelRateDao.insert(levelRate);
        }
        return Result.ok("success");
    }
}
src/main/java/com/xcong/excoin/utils/ShareCodeUtil.java
New file
@@ -0,0 +1,118 @@
package com.xcong.excoin.utils;
import java.util.Random;
/**
 * 邀请码生成器,算法原理:<br/>
 * 1) 获取id: 1127738 <br/>
 * 2) 使用自定义进制转为:gpm6 <br/>
 * 3) 转为字符串,并在后面加'o'字符:gpm6o <br/>
 * 4)在后面随机产生若干个随机数字字符:gpm6o7 <br/>
 * 转为自定义进制后就不会出现o这个字符,然后在后面加个'o',这样就能确定唯一性。最后在后面产生一些随机字符进行补全。<br/>
 */
public class ShareCodeUtil {
    /**
     * 自定义进制(0,1没有加入,容易与o,l混淆)
     */
//    private static final char[] r=new char[]{'q', 'w', 'e', '8', 'a', 's', '2', 'd', 'z', 'x', '9', 'c', '7', 'p', '5', 'i', 'k', '3', 'm', 'j', 'u', 'f', 'r', '4', 'v', 'y', 'l', 't', 'n', '6', 'b', 'g', 'h'};
    private static final char[] r = new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9'};
    /**
     * (不能与自定义进制有重复)
     */
    private static final char b = '0';
    /**
     * 进制长度
     */
    private static final int binLen = r.length;
    /**
     * 序列最小长度
     */
    private static final int s = 8;
    /**
     * 根据ID生成六位随机码
     *
     * @param id ID
     * @return 随机码
     */
    public static String toSerialCode(long id) {
        char[] buf = new char[32];
        int charPos = 32;
        while ((id / binLen) > 0) {
            int ind = (int) (id % binLen);
            buf[--charPos] = r[ind];
            id /= binLen;
        }
        buf[--charPos] = r[(int) (id % binLen)];
        String str = new String(buf, charPos, (32 - charPos));
        // 不够长度的自动随机补全
        if (str.length() < s) {
            StringBuilder sb = new StringBuilder();
            sb.append(b);
            Random rnd = new Random();
            for (int i = 1; i < s - str.length(); i++) {
                sb.append(r[rnd.nextInt(binLen)]);
            }
            str += sb.toString();
        }
        return str;
    }
    /**
     * 根据ID生成六位随机码
     *
     * @param id ID
     * @return 随机码
     */
    public static String toSerialNumberCode(long id) {
        char[] buf = new char[32];
        int charPos = 32;
        while ((id / binLen) > 0) {
            int ind = (int) (id % binLen);
            buf[--charPos] = r[ind];
            id /= binLen;
        }
        buf[--charPos] = r[(int) (id % binLen)];
        String str = new String(buf, charPos, (32 - charPos));
        // 不够长度的自动随机补全
        if (str.length() < s) {
            StringBuilder sb = new StringBuilder();
            sb.append(b);
            Random rnd = new Random();
            for (int i = 1; i < s - str.length(); i++) {
                sb.append(r[rnd.nextInt(binLen)]);
            }
            str += sb.toString();
        }
        return str;
    }
    public static long codeToId(String code) {
        char chs[] = code.toCharArray();
        long res = 0L;
        for (int i = 0; i < chs.length; i++) {
            int ind = 0;
            for (int j = 0; j < binLen; j++) {
                if (chs[i] == r[j]) {
                    ind = j;
                    break;
                }
            }
            if (chs[i] == b) {
                break;
            }
            if (i > 0) {
                res = res * binLen + ind;
            } else {
                res = ind;
            }
        }
        return res;
    }
}
src/main/resources/mapper/member/MemberDao.xml
@@ -5,4 +5,8 @@
    <select id="selectMemberInfoByAccount" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
        select * from member where phone=#{account} or email=#{account}
    </select>
    <select id="selectMemberInfoByRefererId" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
        select * from member where referer_id=#{refererId}
    </select>
</mapper>
src/main/resources/mapper/member/MemberLevelRateDao.xml
New file
@@ -0,0 +1,5 @@
<?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.xcong.excoin.modules.member.dao.MemberLevelRateDao">
</mapper>
src/main/resources/mapper/member/MemberWalletAgentDao.xml
New file
@@ -0,0 +1,6 @@
<?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.xcong.excoin.modules.member.dao.MemberWalletAgentDao">
</mapper>
src/main/resources/mapper/member/MemberWalletCoinDao.xml
New file
@@ -0,0 +1,7 @@
<?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.xcong.excoin.modules.member.dao.MemberWalletCoinDao">
</mapper>
src/main/resources/mapper/member/MemberWalletContractDao.xml
New file
@@ -0,0 +1,6 @@
<?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.xcong.excoin.modules.member.dao.MemberWalletContractDao">
</mapper>
src/test/java/com/xcong/excoin/KssframeworkApplicationTests.java
@@ -1,5 +1,7 @@
package com.xcong.excoin;
import com.xcong.excoin.common.enumerates.CoinTypeEnum;
import com.xcong.excoin.common.enumerates.SymbolEnum;
import com.xcong.excoin.modules.test.dao.TestUserDao;
import com.xcong.excoin.modules.test.entity.TestUserEntity;
import com.xcong.excoin.modules.test.service.TestUserService;
@@ -46,5 +48,10 @@
    }
    @Test
    public void enumTest() {
        System.out.println(SymbolEnum.BCH.getValue());
    }
}