package com.yami.trading.api.controller;
|
|
import cn.hutool.core.util.ObjectUtil;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.yami.trading.api.model.RegisterModel;
|
import com.yami.trading.api.model.UserLoginModel;
|
import com.yami.trading.bean.constans.UserConstants;
|
import com.yami.trading.bean.model.CapitaltWallet;
|
import com.yami.trading.bean.model.Log;
|
import com.yami.trading.bean.model.User;
|
import com.yami.trading.bean.model.Wallet;
|
import com.yami.trading.bean.syspara.domain.Syspara;
|
import com.yami.trading.bean.syspara.dto.SysparasDto;
|
import com.yami.trading.common.constants.Constants;
|
import com.yami.trading.common.domain.Result;
|
import com.yami.trading.common.exception.YamiShopBindException;
|
import com.yami.trading.common.util.IPHelper;
|
import com.yami.trading.dao.CapitaltWalletMapper;
|
import com.yami.trading.security.common.bo.UserInfoInTokenBO;
|
import com.yami.trading.security.common.enums.SysTypeEnum;
|
import com.yami.trading.security.common.manager.PasswordCheckManager;
|
import com.yami.trading.security.common.manager.PasswordManager;
|
import com.yami.trading.security.common.manager.TokenStore;
|
import com.yami.trading.security.common.vo.TokenInfoVO;
|
import com.yami.trading.service.IdentifyingCodeTimeWindowService;
|
import com.yami.trading.service.WalletService;
|
import com.yami.trading.service.syspara.SysparaService;
|
import com.yami.trading.service.system.LogService;
|
import com.yami.trading.service.user.UserDataService;
|
import com.yami.trading.service.user.UserService;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.web.bind.annotation.*;
|
|
import javax.validation.Valid;
|
import javax.validation.constraints.NotEmpty;
|
import java.util.Date;
|
|
/**
|
* @date 2022/3/28 15:20
|
*/
|
@RestController
|
@RequestMapping("api/")
|
@Api(tags = "非登录接口")
|
public class ApiIndexController {
|
@Autowired
|
private TokenStore tokenStore;
|
@Autowired
|
private PasswordCheckManager passwordCheckManager;
|
@Autowired
|
private PasswordManager passwordManager;
|
@Autowired
|
UserService userService;
|
@Autowired
|
private PasswordEncoder passwordEncoder;
|
@Autowired
|
CapitaltWalletMapper capitaltWalletMapper;
|
@Autowired
|
LogService logService;
|
|
@Autowired
|
private WalletService walletService;
|
|
@Autowired
|
private RedisTemplate<String, String> redisTemplate;
|
|
@Autowired
|
SysparaService sysparaService;
|
|
@Autowired
|
UserDataService userDataService;
|
@Autowired
|
IdentifyingCodeTimeWindowService identifyingCodeTimeWindowService;
|
|
|
@PostMapping("/login")
|
@ApiOperation(value = "账号密码(用于前端登录)", notes = "通过账号/手机号/用户名密码登录,还要携带用户的类型,也就是用户所在的系统")
|
public Result<TokenInfoVO> login(
|
@Valid UserLoginModel model) {
|
String mobileOrUserName = model.getUserName();
|
User user=null;
|
if (model.getType()==1){
|
user= userService.findByUserMobile(mobileOrUserName);
|
}
|
if (model.getType()==2){
|
user= userService.findByEmail(mobileOrUserName);
|
}
|
if (model.getType()==3){
|
user= userService.findByUserName(mobileOrUserName);
|
}
|
if (user==null){
|
throw new YamiShopBindException("账号或密码不正确");
|
}
|
|
// 半小时内密码输入错误十次,已限制登录30分钟
|
passwordCheckManager.checkPassword(SysTypeEnum.ORDINARY, model.getUserName(), model.getPassWord(), user.getLoginPassword());
|
UserInfoInTokenBO userInfoInToken = new UserInfoInTokenBO();
|
userInfoInToken.setUserId(user.getUserId());
|
userInfoInToken.setSysType(SysTypeEnum.ORDINARY.value());
|
userInfoInToken.setEnabled(user.getStatus() == 1);
|
user.setUserLastip(IPHelper.getIpAddr());
|
user.setUserLasttime(new Date());
|
userService.online(user.getUserId());
|
userService.updateById(user);
|
tokenStore.deleteAllToken(String.valueOf(SysTypeEnum.ORDINARY.value()), String.valueOf(user.getUserId()));
|
// 存储token返回vo
|
TokenInfoVO tokenInfoVO = tokenStore.storeAndGetVo(userInfoInToken);
|
tokenInfoVO.setToken(tokenInfoVO.getAccessToken());
|
|
return Result.succeed(tokenInfoVO);
|
}
|
|
@PostMapping("/authorizedLogin")
|
@ApiOperation(value = "钱包授权登录(用于前端登录)", notes = "钱包授权登录")
|
public Result<TokenInfoVO> authorizedLogin(@RequestParam @NotEmpty String foxAddress) {
|
|
//查询用户是不是钱包授权注册的
|
User user = userService.getOne(new LambdaQueryWrapper<>(User.class)
|
.eq(User::getUserName, foxAddress)
|
.eq(User::getAuthorizedStatus, 1));
|
|
if(ObjectUtil.isEmpty(user)){
|
user = new User();
|
user.setUserLevel(1);
|
user.setCreditScore(80);
|
user.setSafePassword(passwordEncoder.encode("000000"));
|
user.setLoginPassword(passwordEncoder.encode("000000"));
|
user.setUserName(foxAddress);
|
user.setStatus(1);
|
user.setRoleName(UserConstants.SECURITY_ROLE_MEMBER);
|
user.setUserRegip(IPHelper.getIpAddr());
|
user.setUserLastip(user.getUserRegip());
|
user.setUserCode(getUserCode());
|
user.setCreateTime(new Date());
|
userService.save(user);
|
//1.保存钱包记录
|
Wallet wallet = new Wallet();
|
wallet.setUserId(user.getUserId());
|
wallet.setCreateTime(new Date());
|
walletService.save(wallet);
|
//资金账户
|
CapitaltWallet capitaltWallet = new CapitaltWallet();
|
capitaltWallet.setUserId(user.getUserId());
|
capitaltWallet.setCreateTime(new Date());
|
capitaltWalletMapper.insert(capitaltWallet);
|
//
|
Log log = new Log();
|
log.setCategory(Constants.LOG_CATEGORY_SECURITY);
|
log.setLog("用户注册,ip[" + user.getUserRegip() + "]");
|
log.setUserId(user.getUserId());
|
log.setUsername(user.getUserName());
|
logService.save(log);
|
}
|
|
// 半小时内密码输入错误十次,已限制登录30分钟
|
UserInfoInTokenBO userInfoInToken = new UserInfoInTokenBO();
|
userInfoInToken.setUserId(user.getUserId());
|
userInfoInToken.setSysType(SysTypeEnum.ORDINARY.value());
|
userInfoInToken.setEnabled(user.getStatus() == 1);
|
user.setUserLastip(IPHelper.getIpAddr());
|
user.setUserLasttime(new Date());
|
userService.online(user.getUserId());
|
userService.updateById(user);
|
tokenStore.deleteAllToken(String.valueOf(SysTypeEnum.ORDINARY.value()), String.valueOf(user.getUserId()));
|
// 存储token返回vo
|
TokenInfoVO tokenInfoVO = tokenStore.storeAndGetVo(userInfoInToken);
|
tokenInfoVO.setToken(tokenInfoVO.getAccessToken());
|
|
return Result.succeed(tokenInfoVO);
|
}
|
|
private String getUserCode() {
|
Syspara syspara = sysparaService.find("user_uid_sequence");
|
int random = (int) (Math.random() * 3 + 1);
|
int user_uid_sequence = syspara.getInteger() + random;
|
SysparasDto sysparasDto = new SysparasDto();
|
sysparasDto.setUser_uid_sequence(user_uid_sequence + "");
|
sysparaService.updateSysparas(sysparasDto);
|
String usercode = String.valueOf(user_uid_sequence);
|
return usercode;
|
}
|
|
@PostMapping("/registerNoVerifcode")
|
@ApiOperation(value = "手机/邮箱/用户名注册(无验证码)")
|
public Result register(@Valid RegisterModel model) {
|
|
String username = model.getUserName();
|
String password = model.getPassword();
|
String usercode = model.getUserCode();
|
// 注册类型:1/手机;2/邮箱;3/用户名;
|
int type = model.getType();
|
String key = username;
|
// String authcode = identifyingCodeTimeWindowService.getAuthCode(key);
|
// if (StringUtils.isBlank(model.getEmailCode()) ||(authcode == null) || (!authcode.equals(model.getEmailCode()))) {
|
// throw new YamiShopBindException("验证码不正确");
|
// }
|
User user = userService.register(model.getUserName(),
|
passwordEncoder.encode(password)
|
, model.getUserCode(), model.getType(),false);
|
UserInfoInTokenBO userInfoInToken = new UserInfoInTokenBO();
|
userInfoInToken.setUserId(user.getUserId());
|
userService.online(user.getUserId());
|
userInfoInToken.setSysType(SysTypeEnum.ORDINARY.value());
|
userInfoInToken.setEnabled(user.getStatus() == 1);
|
userDataService.saveRegister(user.getUserId());
|
tokenStore.deleteAllToken(String.valueOf(SysTypeEnum.ORDINARY.value()), String.valueOf(user.getUserId()));
|
|
// 存储token返回vo
|
TokenInfoVO tokenInfoVO = tokenStore.storeAndGetVo(userInfoInToken);
|
tokenInfoVO.setToken(tokenInfoVO.getAccessToken());
|
|
return Result.succeed(tokenInfoVO);
|
}
|
|
}
|