From a5b282e1c85ea498377215e43ff475054bf2e4e2 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Mon, 18 May 2020 20:34:20 +0800
Subject: [PATCH] finish login interface and modify some issue

---
 src/main/java/com/xcong/excoin/utils/SSLClient.java                                  |   49 +++
 src/main/java/com/xcong/excoin/common/system/controller/CommonController.java        |   70 +++++
 src/main/java/com/xcong/excoin/common/system/bean/LoginUserBean.java                 |    2 
 pom.xml                                                                              |    9 
 src/main/java/com/xcong/excoin/modules/member/entity/MemberAuthenticationEntity.java |   56 ++++
 src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java               |   88 ++++++
 src/main/java/com/xcong/excoin/common/contants/AppContants.java                      |   10 
 src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java  |    2 
 src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java    |   13 +
 src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletCoinEntity.java     |   61 ++++
 src/main/java/com/xcong/excoin/common/system/base/BaseEntity.java                    |    2 
 src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java       |   15 +
 src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletAgentEntity.java    |   53 ++++
 src/main/java/com/xcong/excoin/configurations/GlobalExceptionHandler.java            |   17 
 src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletContractEntity.java |   33 ++
 src/main/java/com/xcong/excoin/common/system/service/UserDetailsServiceImpl.java     |   24 +
 src/main/java/com/xcong/excoin/common/exception/GlobalException.java                 |   17 +
 src/main/resources/mapper/member/MemberDao.xml                                       |    8 
 src/main/java/com/xcong/excoin/configurations/interceptor/MybatisInterceptor.java    |    8 
 src/main/java/com/xcong/excoin/modules/test/entity/TestUserEntity.java               |    4 
 src/main/java/com/xcong/excoin/utils/SmsUtils.java                                   |   96 +++++++
 src/main/java/com/xcong/excoin/common/system/controller/LoginController.java         |   33 ++
 src/main/resources/application.yml                                                   |    3 
 src/main/java/com/xcong/excoin/common/system/dto/RegisterDto.java                    |   38 ++
 src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java                     |   13 +
 src/main/java/com/xcong/excoin/modules/member/service/MemberService.java             |   11 
 26 files changed, 714 insertions(+), 21 deletions(-)

diff --git a/pom.xml b/pom.xml
index 4431a55..dbdfbfe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -165,6 +165,15 @@
             <version>${fastjson.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>1.6.1</version>
+        </dependency>
 
     </dependencies>
 
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 7a27f94..08660f1 100644
--- a/src/main/java/com/xcong/excoin/common/contants/AppContants.java
+++ b/src/main/java/com/xcong/excoin/common/contants/AppContants.java
@@ -27,4 +27,14 @@
      */
     public static final String TOKEN_START_WITH = "Bearer ";
 
+    /**
+     * 账号类型-手机号
+     */
+    public static final String ACCOUNT_TYPE_MOBILE = "1";
+
+    /**
+     * 账号类型-邮箱
+     */
+    public static final String ACCOUNT_TYPE_EMAIL = "2";
+
 }
diff --git a/src/main/java/com/xcong/excoin/common/exception/GlobalException.java b/src/main/java/com/xcong/excoin/common/exception/GlobalException.java
new file mode 100644
index 0000000..938cd36
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/common/exception/GlobalException.java
@@ -0,0 +1,17 @@
+package com.xcong.excoin.common.exception;
+
+import lombok.Getter;
+
+/**
+ * 统一异常处理
+ *
+ * @author wzy
+ * @date 2020-05-18
+ **/
+@Getter
+public class GlobalException extends RuntimeException {
+
+    public GlobalException(String msg) {
+        super(msg);
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/common/system/base/BaseEntity.java b/src/main/java/com/xcong/excoin/common/system/base/BaseEntity.java
index f9eecfa..79c0ff1 100644
--- a/src/main/java/com/xcong/excoin/common/system/base/BaseEntity.java
+++ b/src/main/java/com/xcong/excoin/common/system/base/BaseEntity.java
@@ -28,4 +28,6 @@
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date updateTime;
+
+    private Integer version;
 }
diff --git a/src/main/java/com/xcong/excoin/common/system/bean/LoginUserBean.java b/src/main/java/com/xcong/excoin/common/system/bean/LoginUserBean.java
index a2e10cf..0924317 100644
--- a/src/main/java/com/xcong/excoin/common/system/bean/LoginUserBean.java
+++ b/src/main/java/com/xcong/excoin/common/system/bean/LoginUserBean.java
@@ -32,7 +32,7 @@
     @JsonIgnore
     @Override
     public String getUsername() {
-        return memberEntity.getUsername();
+        return "";
     }
 
     @JsonIgnore
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
new file mode 100644
index 0000000..db35bd2
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/common/system/controller/CommonController.java
@@ -0,0 +1,70 @@
+package com.xcong.excoin.common.system.controller;
+
+import com.xcong.excoin.common.contants.AppContants;
+import com.xcong.excoin.common.response.Result;
+import com.xcong.excoin.utils.RedisUtils;
+import com.xcong.excoin.utils.SmsUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+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.RestController;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 公共请求类
+ *
+ * @author wzy
+ * @date 2020-05-18
+ **/
+@Slf4j
+@Api(value = "公共请求类", tags = "公共请求类")
+@RestController
+@RequestMapping(value = "/common")
+public class CommonController {
+
+    private static final String SUCCESS = "Success";
+
+    @Resource
+    private RedisUtils redisUtils;
+
+    @ApiOperation(value = "获取验证码接口", notes = "获取验证码通用接口")
+    @GetMapping(value = "/verifyCode")
+    public Result verifyCode(String account, String type) {
+        log.info("#账号:{}, 类型:{}#", account, type);
+
+        int code = (int) ((Math.random() * 9 + 1) * 100000);
+        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);
+                map.put("code", flag);
+                return Result.ok("success", map);
+            }
+        } else if (AppContants.ACCOUNT_TYPE_EMAIL.equals(type)) {
+            return Result.ok("success");
+        } else {
+            log.info("未定义账号类型");
+            return Result.fail("fail");
+        }
+        return Result.fail("fail");
+    }
+
+    @ApiOperation(value = "验证验证码是否正确", notes = "验证验证码是否正确")
+    @GetMapping(value = "/checkVerify")
+    public Result checkVerify() {
+        return null;
+    }
+
+    @ApiOperation(value = "文件上次接口", notes = "文件上传")
+    @GetMapping(value = "/uploadFile")
+    public Result uploadFile() {
+        return null;
+    }
+}
diff --git a/src/main/java/com/xcong/excoin/common/system/controller/LoginController.java b/src/main/java/com/xcong/excoin/common/system/controller/LoginController.java
index e10dc75..8e2d3d2 100644
--- a/src/main/java/com/xcong/excoin/common/system/controller/LoginController.java
+++ b/src/main/java/com/xcong/excoin/common/system/controller/LoginController.java
@@ -1,17 +1,23 @@
 package com.xcong.excoin.common.system.controller;
 
 import cn.hutool.core.util.IdUtil;
+import cn.hutool.crypto.SecureUtil;
 import cn.hutool.crypto.asymmetric.KeyType;
 import cn.hutool.crypto.asymmetric.RSA;
+import cn.hutool.crypto.asymmetric.Sign;
+import cn.hutool.crypto.asymmetric.SignAlgorithm;
 import com.alibaba.fastjson.JSONObject;
 import com.xcong.excoin.common.contants.AppContants;
 import com.xcong.excoin.common.response.Result;
 import com.xcong.excoin.common.system.bean.LoginUserBean;
 import com.xcong.excoin.common.system.dto.LoginDto;
+import com.xcong.excoin.common.system.dto.RegisterDto;
 import com.xcong.excoin.configurations.properties.ApplicationProperties;
 import com.xcong.excoin.configurations.properties.SecurityProperties;
+import com.xcong.excoin.modules.member.service.MemberService;
 import com.xcong.excoin.utils.RedisUtils;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -31,10 +37,13 @@
  * @Version V1.0
  **/
 @Slf4j
-@Api(value = "登陆类", tags = "登陆类")
+@Api(value = "登陆注册类", tags = "登陆注册类")
 @RestController
 @RequestMapping(value = "/")
 public class LoginController {
+
+    @Resource
+    private MemberService memberservice;
 
     @Resource
     private ApplicationProperties applicationProperties;
@@ -48,14 +57,25 @@
     @Resource
     private RedisUtils redisUtils;
 
+    @ApiOperation(value = "登陆接口", notes = "登陆接口")
     @PostMapping("/login")
     public Result login(@RequestBody @Validated LoginDto loginDto) {
+        // 使用md5加密前端传来的密码
+        Sign sign = SecureUtil.sign(SignAlgorithm.MD5withRSA);
+        byte[] pwdByte = sign.sign(loginDto.getPassword().getBytes());
+
+        // 将账号密码交给spring security验证,并调用userServiceDetails
         UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(loginDto.getUsername(), loginDto.getPassword());
         Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authToken);
-        String token = IdUtil.simpleUUID();
+
+        // 获取当前验证过后的用户
         LoginUserBean loginUserBean = (LoginUserBean) authentication.getPrincipal();
-        redisUtils.set(AppContants.APP_LOGIN_PREFIX + token, JSONObject.toJSONString(loginUserBean), 300000);
+
+        // 生成UUID作为token
+        String token = IdUtil.simpleUUID();
+        redisUtils.set(AppContants.APP_LOGIN_PREFIX + token, JSONObject.toJSONString(loginUserBean), applicationProperties.getRedisExpire());
         Map<String, Object> authInfo = new HashMap<>();
+        // 开启debug模式,则将加密后的token返回
         if (applicationProperties.isDebug()) {
             authInfo.put("token", token);
             authInfo.put("rsaToken", generateAsaToken(token));
@@ -71,4 +91,11 @@
         RSA rsa = new RSA(null, securityProperties.getPublicKey());
         return rsa.encryptBase64(token + "_" +System.currentTimeMillis(), KeyType.PublicKey);
     }
+
+    @ApiOperation(value = "app注册接口", notes = "app注册接口,验证码必须输入可默认为123456")
+    @PostMapping(value = "/register")
+    public Result register(@RequestBody @Validated RegisterDto registerDto) {
+        return null;
+    }
+
 }
diff --git a/src/main/java/com/xcong/excoin/common/system/dto/RegisterDto.java b/src/main/java/com/xcong/excoin/common/system/dto/RegisterDto.java
new file mode 100644
index 0000000..230d52e
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/common/system/dto/RegisterDto.java
@@ -0,0 +1,38 @@
+package com.xcong.excoin.common.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 注册用户接收类
+ *
+ * @author wzy
+ * @date 2020-05-18
+ **/
+@Data
+@ApiModel(value = "注册接口参数类", description = "注册接口参数类")
+public class RegisterDto {
+
+    @ApiModelProperty(value = "账号", example = "13412341234")
+    @NotBlank(message = "账号不能为空")
+    private String account;
+
+    @ApiModelProperty(value = "密码", example = "123456")
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+    @ApiModelProperty(value = "账号类型", notes = "1-手机 2-邮箱", example = "1")
+    @NotBlank(message = "账号类型不能为空")
+    private String type;
+
+    @ApiModelProperty(value = "验证码", example = "123456")
+    @NotBlank(message = "验证码不能为空")
+    private String code;
+
+    @ApiModelProperty(value = "推荐人id", example = "rxadr3")
+    private String refererId;
+}
diff --git a/src/main/java/com/xcong/excoin/common/system/service/UserDetailsServiceImpl.java b/src/main/java/com/xcong/excoin/common/system/service/UserDetailsServiceImpl.java
index c33fc4b..508dff9 100644
--- a/src/main/java/com/xcong/excoin/common/system/service/UserDetailsServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/common/system/service/UserDetailsServiceImpl.java
@@ -1,6 +1,11 @@
 package com.xcong.excoin.common.system.service;
 
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.asymmetric.Sign;
+import cn.hutool.crypto.asymmetric.SignAlgorithm;
+import com.xcong.excoin.common.exception.GlobalException;
 import com.xcong.excoin.common.system.bean.LoginUserBean;
+import com.xcong.excoin.modules.member.dao.MemberDao;
 import com.xcong.excoin.modules.member.entity.MemberEntity;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.security.core.GrantedAuthority;
@@ -9,6 +14,7 @@
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -22,16 +28,26 @@
 @Service("userDetailsService")
 public class UserDetailsServiceImpl implements UserDetailsService {
 
+    @Resource
+    private MemberDao memberDao;
+
     @Override
     public LoginUserBean loadUserByUsername(String username) throws UsernameNotFoundException {
+        log.info("#登陆账号:{}#", username);
         List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
 //        GrantedAuthority grantedAuthority = new SimpleGrantedAuthority("ROLE_ADMIN");
 //        grantedAuthorities.add(grantedAuthority);
 
-        MemberEntity memberEntity = new MemberEntity();
-        memberEntity.setId(1L);
-        memberEntity.setUsername("11111");
-        memberEntity.setPassword(new BCryptPasswordEncoder().encode("123456"));
+        MemberEntity memberEntity = memberDao.selectMemberInfoByAccount(username);
+        if (memberEntity != null) {
+            memberEntity.setPassword(new BCryptPasswordEncoder().encode(memberEntity.getPassword()));
+        } else {
+            throw new UsernameNotFoundException("");
+        }
+
+        if (MemberEntity.ACCOUNT_STATUS_DISABLED == memberEntity.getAccountStatus()) {
+            throw new GlobalException("账号已被禁用");
+        }
 
         return new LoginUserBean(memberEntity, null, null);
     }
diff --git a/src/main/java/com/xcong/excoin/configurations/GlobalExceptionHandler.java b/src/main/java/com/xcong/excoin/configurations/GlobalExceptionHandler.java
index 97ed2d9..99efc56 100644
--- a/src/main/java/com/xcong/excoin/configurations/GlobalExceptionHandler.java
+++ b/src/main/java/com/xcong/excoin/configurations/GlobalExceptionHandler.java
@@ -1,5 +1,6 @@
 package com.xcong.excoin.configurations;
 
+import com.xcong.excoin.common.exception.GlobalException;
 import com.xcong.excoin.common.response.Result;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.dao.DuplicateKeyException;
@@ -49,11 +50,6 @@
         return null;
     }
 
-    @ExceptionHandler(value = {Exception.class})
-    public Result handleException(Exception e) {
-        log.error(e.getMessage(), e);
-        return Result.fail("系统异常");
-    }
 
     /**
      * spring security 账户密码验证异常
@@ -67,4 +63,15 @@
         return Result.fail("用户名或密码错误");
     }
 
+    @ExceptionHandler(value = {GlobalException.class})
+    public Result handleException(GlobalException e) {
+        return Result.fail(e.getMessage());
+    }
+
+    @ExceptionHandler(value = {Exception.class})
+    public Result handleException(Exception e) {
+        log.error(e.getMessage(), e);
+        return Result.fail("系统异常");
+    }
+
 }
diff --git a/src/main/java/com/xcong/excoin/configurations/interceptor/MybatisInterceptor.java b/src/main/java/com/xcong/excoin/configurations/interceptor/MybatisInterceptor.java
index b60a5a3..f7b0c87 100644
--- a/src/main/java/com/xcong/excoin/configurations/interceptor/MybatisInterceptor.java
+++ b/src/main/java/com/xcong/excoin/configurations/interceptor/MybatisInterceptor.java
@@ -79,8 +79,9 @@
         if (o instanceof BaseEntity) {
             BaseEntity baseEntity = (BaseEntity) o;
             if (member != null) {
-                baseEntity.setCreateBy(member.getUsername());
-                baseEntity.setUpdateBy(member.getUsername());
+                String by = member.getPhone() != null ? member.getPhone() : member.getEmail();
+                baseEntity.setCreateBy(by);
+                baseEntity.setUpdateBy(by);
             } else {
                 baseEntity.setCreateBy(AppContants.SYSTEM_USER);
                 baseEntity.setUpdateBy(AppContants.SYSTEM_USER);
@@ -95,7 +96,8 @@
         if (o instanceof BaseEntity) {
             BaseEntity baseEntity = (BaseEntity) o;
             if (member != null) {
-                baseEntity.setUpdateBy(member.getUsername());
+                String by = member.getPhone() != null ? member.getPhone() : member.getEmail();
+                baseEntity.setUpdateBy(by);
             } else {
                 baseEntity.setUpdateBy(AppContants.SYSTEM_USER);
             }
diff --git a/src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java b/src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java
index cdacf9b..9e877ec 100644
--- a/src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java
+++ b/src/main/java/com/xcong/excoin/configurations/properties/ApplicationProperties.java
@@ -15,4 +15,6 @@
 @ConfigurationProperties(prefix = "app")
 public class ApplicationProperties {
     private boolean debug;
+
+    private Long redisExpire;
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java b/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
new file mode 100644
index 0000000..a5c5fdf
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/controller/MemberController.java
@@ -0,0 +1,15 @@
+package com.xcong.excoin.modules.member.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 用户类
+ *
+ * @author wzy
+ * @date 2020-05-18
+ **/
+@RestController
+@RequestMapping(value = "/api/member")
+public class MemberController {
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java b/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
new file mode 100644
index 0000000..31545ba
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/dao/MemberDao.java
@@ -0,0 +1,13 @@
+package com.xcong.excoin.modules.member.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * @author wzy
+ */
+public interface MemberDao extends BaseMapper<MemberEntity> {
+
+    public MemberEntity selectMemberInfoByAccount(@Param("account") String account);
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/entity/MemberAuthenticationEntity.java b/src/main/java/com/xcong/excoin/modules/member/entity/MemberAuthenticationEntity.java
new file mode 100644
index 0000000..03af297
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/entity/MemberAuthenticationEntity.java
@@ -0,0 +1,56 @@
+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-05-18
+ **/
+@Data
+@TableName("member_authentication")
+public class MemberAuthenticationEntity extends BaseEntity {
+
+    /**
+     * 用户ID
+     */
+    private Long memberId;
+
+    /**
+     * 真实姓名
+     */
+    private String realName;
+
+    /**
+     * 姓
+     */
+    private String firstName;
+
+    /**
+     * 名
+     */
+    private String secondName;
+
+    /**
+     * 国家
+     */
+    private String nation;
+
+    /**
+     * 身份证正面
+     */
+    private String idcardImageFront;
+
+    /**
+     * 身份证背面
+     */
+    private String idcardImageBack;
+
+    /**
+     * 手持身份证
+     */
+    private String idcardImageInHand;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java b/src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java
index 11eff4b..66c6c9a 100644
--- a/src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java
+++ b/src/main/java/com/xcong/excoin/modules/member/entity/MemberEntity.java
@@ -1,5 +1,6 @@
 package com.xcong.excoin.modules.member.entity;
 
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.xcong.excoin.common.system.base.BaseEntity;
 import lombok.Data;
 
@@ -12,12 +13,91 @@
  * @date 2020-05-12
  **/
 @Data
-public class MemberEntity extends BaseEntity implements Serializable {
-    private static final long serialVersionUID = -1L;
+@TableName("member")
+public class MemberEntity extends BaseEntity {
 
-    private Long id;
+    /**
+     * 账号状态 - 禁用
+     */
+    public static final Integer ACCOUNT_STATUS_DISABLED = 0;
 
-    private String username;
+    /**
+     * 账号状态 - 启用
+     */
+    public static final Integer ACCOUNT_STATUS_ENABLE = 1;
 
+    /**
+     * 手机号(包含国际手机号)
+     */
+    private String phone;
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 登陆密码
+     */
     private String password;
+
+    /**
+     * 交易密码
+     */
+    private String tradePassword;
+
+    /**
+     * 交易密码时效性设置
+     */
+    private Integer tradeAgingSetting;
+
+    /**
+     * 邀请码
+     */
+    private String inviteId;
+
+    /**
+     * 账号状态 0-禁用 1-启用
+     */
+    private int accountStatus;
+
+    /**
+     * 上级推荐人id
+     */
+    private String refererId;
+
+    /**
+     * 上级推荐人ID链
+     */
+    private String refererIds;
+
+    /**
+     * 账号类型 1-正常账号 2-测试账号
+     */
+    private Integer accountType;
+
+    /**
+     * 代理级别
+     */
+    private Integer agentLevel;
+
+    /**
+     * 实名认证状态 0-审核未通过 1-审核通过 2-等待审核
+     */
+    private Integer certifyStatus;
+
+    /**
+     * 身份证号
+     */
+    private String idcardNo;
+
+    /**
+     * 是否设置盈亏难度系数 0-否1-是
+     */
+    private Integer isProfit;
+
+    /**
+     * 是否设置预估强平价系数 0-否1-是
+     */
+    private Integer isForce;
 }
diff --git a/src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletAgentEntity.java b/src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletAgentEntity.java
new file mode 100644
index 0000000..5c87492
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletAgentEntity.java
@@ -0,0 +1,53 @@
+package com.xcong.excoin.modules.member.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 代理用户钱包
+ *
+ * @author wzy
+ * @date 2020-05-18
+ **/
+@Data
+@TableName("member_wallet_agent")
+public class MemberWalletAgentEntity extends BaseEntity {
+
+    /**
+     * 用户Id
+     */
+    private Long memberId;
+
+    /**
+     * 可用余额
+     */
+    private BigDecimal availableBalance;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal totalBalance;
+
+    /**
+     * 冻结金额
+     */
+    private BigDecimal frozenBalance;
+
+    /**
+     * 借入资产金额
+     */
+    private BigDecimal borrowedFund;
+
+    /**
+     * 钱包标识
+     */
+    private String walletCode;
+
+    /**
+     * 钱包地址
+     */
+    private String walletAddress;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletCoinEntity.java b/src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletCoinEntity.java
new file mode 100644
index 0000000..cab2390
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletCoinEntity.java
@@ -0,0 +1,61 @@
+package com.xcong.excoin.modules.member.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-05-18
+ **/
+@Data
+@TableName("member_wallet_coin")
+public class MemberWalletCoinEntity extends BaseEntity {
+
+    /**
+     * 用户Id
+     */
+    private Long memberId;
+
+    /**
+     * 可用余额
+     */
+    private BigDecimal availableBalance;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal totalBalance;
+
+    /**
+     * 冻结金额
+     */
+    private BigDecimal frozenBalance;
+
+    /**
+     * 借入资产金额
+     */
+    private BigDecimal borrowedFund;
+
+    /**
+     * 钱包标识
+     */
+    private String walletCode;
+
+    /**
+     * 钱包地址
+     */
+    private String walletAddress;
+
+    /**
+     * 上次余额
+     */
+    private BigDecimal earlyBalance;
+
+    /**
+     * 区块编号
+     */
+    private int blockNumber;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletContractEntity.java b/src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletContractEntity.java
new file mode 100644
index 0000000..533425d
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/entity/MemberWalletContractEntity.java
@@ -0,0 +1,33 @@
+package com.xcong.excoin.modules.member.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xcong.excoin.common.system.base.BaseEntity;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wzy
+ * @date 2020-05-18
+ **/
+@Data
+@TableName("member_wallet_contract")
+public class MemberWalletContractEntity extends BaseEntity {
+    private Long memberId;
+
+    private BigDecimal availableBalance;
+
+    private BigDecimal totalBalance;
+
+    private BigDecimal frozenBalance;
+
+    private BigDecimal borrowedFund;
+
+    private BigDecimal earlyBalance;
+
+    private int blockNumber;
+
+    private String walletCode;
+
+    private String walletAddress;
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java b/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
new file mode 100644
index 0000000..612ebee
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/service/MemberService.java
@@ -0,0 +1,11 @@
+package com.xcong.excoin.modules.member.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xcong.excoin.modules.member.entity.MemberEntity;
+import com.xcong.excoin.modules.test.entity.TestUserEntity;
+
+/**
+ * @author wzy
+ */
+public interface MemberService extends IService<MemberEntity> {
+}
diff --git a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
new file mode 100644
index 0000000..5d93e06
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -0,0 +1,13 @@
+package com.xcong.excoin.modules.member.service.impl;
+
+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.modules.member.service.MemberService;
+
+/**
+ * @author wzy
+ * @date 2020-05-18
+ **/
+public class MemberServiceImpl extends ServiceImpl<MemberDao, MemberEntity> implements MemberService {
+}
diff --git a/src/main/java/com/xcong/excoin/modules/test/entity/TestUserEntity.java b/src/main/java/com/xcong/excoin/modules/test/entity/TestUserEntity.java
index d4373d5..13a3879 100644
--- a/src/main/java/com/xcong/excoin/modules/test/entity/TestUserEntity.java
+++ b/src/main/java/com/xcong/excoin/modules/test/entity/TestUserEntity.java
@@ -1,5 +1,6 @@
 package com.xcong.excoin.modules.test.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.xcong.excoin.common.system.base.BaseEntity;
 import lombok.Data;
@@ -19,4 +20,7 @@
     private String account;
 
     private String password;
+
+    @TableField(exist = false)
+    private String aaaaa;
 }
diff --git a/src/main/java/com/xcong/excoin/utils/SSLClient.java b/src/main/java/com/xcong/excoin/utils/SSLClient.java
new file mode 100644
index 0000000..0b26d23
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/utils/SSLClient.java
@@ -0,0 +1,49 @@
+package com.xcong.excoin.utils;
+
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.impl.client.DefaultHttpClient;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+
+@SuppressWarnings("deprecation")
+class SSLClient extends DefaultHttpClient {
+	public SSLClient() throws Exception {
+		super();
+		SSLContext ctx = SSLContext.getInstance("TLS");
+		X509TrustManager tm = new X509TrustManager() {
+
+			@Override
+			public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+				// TODO Auto-generated method stub
+
+			}
+
+			@Override
+			public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+				// TODO Auto-generated method stub
+
+			}
+
+			@Override
+			public X509Certificate[] getAcceptedIssuers() {
+				// TODO Auto-generated method stub
+				return null;
+			}
+
+		};
+		ctx.init(null, new TrustManager[] { tm }, null);
+
+		SSLSocketFactory ssf = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+		ClientConnectionManager ccm = this.getConnectionManager();
+		SchemeRegistry sr = ccm.getSchemeRegistry();
+		sr.register(new Scheme("https", 443, ssf));
+	}
+}
\ No newline at end of file
diff --git a/src/main/java/com/xcong/excoin/utils/SmsUtils.java b/src/main/java/com/xcong/excoin/utils/SmsUtils.java
new file mode 100644
index 0000000..4adc0ee
--- /dev/null
+++ b/src/main/java/com/xcong/excoin/utils/SmsUtils.java
@@ -0,0 +1,96 @@
+package com.xcong.excoin.utils;
+
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.util.EntityUtils;
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 短信发送工具
+ *
+ * @author wzy
+ * @date 2020-05-18
+ **/
+public class SmsUtils {
+
+
+    private static HttpClient httpclient;
+
+    @SuppressWarnings("deprecation")
+    public static Map<String, Object> hxSmsSend(String mobile, String sendContent) {
+        Map<String, Object> map = new HashMap<String, Object>();
+        try {
+            httpclient = new SSLClient();
+            //TFT001
+            String url = "https://dx.ipyy.net/sms.aspx";
+            //excoin DX001		//ctcoin:OT00028			//改为实际账号名
+            String accountName = "DX001";
+            //excoin 1qaz2wsx	//ctcoin:	atvckt				//改为实际发送密码
+            String password = "1qaz2wsx";
+            String text = sendContent;
+            HttpPost post = new HttpPost(url);
+            post.setHeader("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
+            List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+            nvps.add(new BasicNameValuePair("action", "send"));
+            nvps.add(new BasicNameValuePair("userid", ""));
+            nvps.add(new BasicNameValuePair("account", accountName));
+            nvps.add(new BasicNameValuePair("password", password));
+            //多个手机号用逗号分隔
+            nvps.add(new BasicNameValuePair("mobile", mobile));
+            nvps.add(new BasicNameValuePair("content", text));
+            nvps.add(new BasicNameValuePair("sendTime", ""));
+            nvps.add(new BasicNameValuePair("extno", ""));
+
+            post.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
+
+            HttpResponse response = httpclient.execute(post);
+            HttpEntity entity = response.getEntity();
+            // 将字符转化为XML
+            String returnString = EntityUtils.toString(entity, "UTF-8");
+            Document doc = DocumentHelper.parseText(returnString);
+            // 获取根节点
+            Element rootElt = doc.getRootElement();
+            // 获取根节点下的子节点的值
+            String returnstatus = rootElt.elementText("returnstatus").trim();
+            String message = rootElt.elementText("message").trim();
+            String remainpoint = rootElt.elementText("remainpoint").trim();
+            String taskID = rootElt.elementText("taskID").trim();
+            String successCounts = rootElt.elementText("successCounts").trim();
+
+            map.put("returnstatus", returnstatus);
+            map.put("message", message);
+            map.put("remainpoint", remainpoint);
+            map.put("taskID", taskID);
+            map.put("successCounts", successCounts);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 短信验证码
+     *
+     * @param phone 手机号
+     * @param code  验证码
+     * @return
+     */
+    public static Map<String, Object> sendVerifyCode(String phone, int code) {
+        String smsContent = "【Excoin】您的验证码为:"+code+",该验证码有效期为2分钟,请勿泄露于他人。";
+        return hxSmsSend(phone, smsContent);
+    }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index e418a9f..7e1d602 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -70,11 +70,12 @@
     ## 连接超时时间(毫秒)
     timeout: 30000
 mybatis-plus:
-  mapper-locations: classpath:mapper/*.xml
+  mapper-locations: classpath:mapper/**/*.xml
 
 
 app:
   debug: true
+  redis_expire: 3000
 
 rsa:
   public_key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCf8UFZK54AiK4PRu7tNd+Z8qZ77o/QXCnk25DRmygVpOEu5mGNSAvfnWmKp2pEV2RljeXq3Rid/+LQkonaebMJeXKSF0yxL/VgyeT8JaQ5gNbOrdfdlc+mFkXJyzyJt8YkvApEdPRNSU2ENBn7mgRfD0BYPM4vZ6/rv+de38FJwIDAQAB
diff --git a/src/main/resources/mapper/member/MemberDao.xml b/src/main/resources/mapper/member/MemberDao.xml
new file mode 100644
index 0000000..0a0c8b1
--- /dev/null
+++ b/src/main/resources/mapper/member/MemberDao.xml
@@ -0,0 +1,8 @@
+<?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.MemberDao">
+
+    <select id="selectMemberInfoByAccount" resultType="com.xcong.excoin.modules.member.entity.MemberEntity">
+        select * from member where phone=#{account} or email=#{account}
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1