package com.zd.auth.controller;
import cn.hutool.core.util.RandomUtil;
import com.zd.auth.form.LoginBody;
import com.zd.auth.form.RegisterBody;
import com.zd.auth.service.SysLoginService;
import com.zd.chemical.api.fegin.RemoteStockService;
import com.zd.common.core.exception.ParamException;
import com.zd.common.core.exception.ServiceException;
import com.zd.common.core.redis.RedisService;
import com.zd.common.core.security.TokenService;
import com.zd.common.core.utils.DESUtils;
import com.zd.common.core.utils.IdUtils;
import com.zd.common.core.utils.StringUtils;
import com.zd.model.constant.*;
import com.zd.model.domain.AjaxResult;
import com.zd.model.domain.R;
import com.zd.model.domain.ResultData;
import com.zd.model.entity.LoginModel;
import com.zd.model.entity.LoginUser;
import com.zd.model.entity.SysUser;
import com.zd.system.api.bo.SysLoginBo;
import com.zd.system.api.feign.RemoteUserService;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import static com.zd.model.constant.BaseConstants.CODE_EXPIRATION;
/***
*
认证接口
*
* @author linft
* @date 6/21/2023
* @version 3.0
*/
@RestController
public class AuthController {
private final Logger logger = LoggerFactory.getLogger(AuthController.class);
@Autowired
private TokenService tokenService;
@Autowired
private SysLoginService sysLoginService;
@Autowired
private RemoteUserService remoteUserService;
@Autowired
private RemoteStockService stockService;
@Resource
private RedisTemplate redisTemplate;
@Autowired
private RedisService redisService;
@PostMapping("/login")
public R login(@RequestBody LoginBody form) {
// 用户登录
String authType = form.getAuthType() == null ? BaseConstants.GRANT_TYPE_PASSWORD : form.getAuthType();
LoginModel loginModel = new LoginModel();
SysLoginBo loginBo = new SysLoginBo();
loginBo.setAccount(form.getUsername());
loginBo.setGrantType(authType);
if (BaseConstants.GRANT_TYPE_PASSWORD.equals(authType)) {
//校验参数
if (StringUtils.isEmpty(form.getUsername()) || StringUtils.isEmpty(form.getPassword())) {
throw new ParamException("账号信息不能为空");
} else if (form.getUsername().length() < UserConstants.USERNAME_MIN_LENGTH
|| form.getUsername().length() > UserConstants.USERNAME_MAX_LENGTH
|| form.getPassword().length() < UserConstants.PASSWORD_MIN_LENGTH
|| form.getPassword().length() > UserConstants.PASSWORD_MAX_LENGTH) {
throw new ParamException("账号参数有误");
} else {
loginBo.setPassword(form.getPassword());
loginBo.setLoginType(UserConstants.USER_LOGIN_PC);
R r = remoteUserService.userLogin(loginBo);
if (r.getCode() == HttpStatus.SUCCESS && r.getData() != null) {
loginModel = r.getData();
} else if (r.getCode() == HttpStatus.ERROR){
return R.fail(r.getMsg());
}
}
} else if (BaseConstants.GRANT_TYPE_MOBILE.equals(authType)) {
//手机号
String key = BaseConstants.DEFAULT_CODE_KEY + BaseConstants.GRANT_TYPE_MOBILE + "@" + form.getUsername();
String code = redisTemplate.opsForValue().get(key);
if (form.getPassword().equals(code)) {
R r = remoteUserService.phoneAccount(loginBo);
if (r.getCode() == HttpStatus.SUCCESS && r.getData() != null) {
loginModel = r.getData();
} else if (r.getCode() == HttpStatus.ERROR){
return R.fail(r.getMsg());
}
}
}
loginModel.setLoginType(UserConstants.USER_LOGIN_PC);
Map data = tokenService.createToken(loginModel);
//这里判断输入的密码,是否和默认配置密码一样,如果一样,需要提示跳转设置密码
AjaxResult resultPassword = remoteUserService.getConfigKey("sys.user.initPassword");
if ((resultPassword.get("code") + "").equals("200")) {
String defaultPassword = (String) resultPassword.get("msg");
if (defaultPassword != null && defaultPassword.equals(form.getPassword())) {
data.put("reset_password", true);
} else {
data.put("reset_password", false);
}
}
// 区分大屏用户
// 查询大屏链接
AjaxResult result = remoteUserService.getRouters(loginModel.getUserId());
try {
List