package com.jilongda.optometrist.authority.controller;
|
|
import com.jilongda.common.basic.ApiResult;
|
import com.jilongda.common.basic.Constant;
|
import com.jilongda.common.exception.ServiceException;
|
import com.jilongda.common.log.OperLoginLog;
|
import com.jilongda.common.redis.RedisAutoTemplate;
|
import com.jilongda.common.security.SecurityUtils;
|
import com.jilongda.common.utils.WebUtils;
|
import com.jilongda.optometrist.authority.dto.LoginCodeDTO;
|
import com.jilongda.optometrist.authority.dto.LoginDTO;
|
import com.jilongda.optometrist.authority.dto.VerificationCodeDTO;
|
import com.jilongda.optometrist.authority.model.SecUser;
|
import com.jilongda.optometrist.authority.service.SecUserService;
|
import com.jilongda.optometrist.model.TOptometrist;
|
import com.jilongda.optometrist.security.SecurityUserDetails;
|
import com.jilongda.optometrist.service.TOptometristService;
|
import com.jilongda.optometrist.utils.MsgUtils;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.security.authentication.AuthenticationManager;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.util.Assert;
|
import org.springframework.util.StringUtils;
|
import org.springframework.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.*;
|
|
import java.util.HashMap;
|
import java.util.Map;
|
|
/**
|
* @author xiaochen
|
* @ClassName LoginController
|
* @Description
|
* @date 2022-05-23 17:24
|
*/
|
@Slf4j
|
@Api(tags = "验光师登录 相关接口")
|
@RestController
|
@Transactional(rollbackFor = Exception.class)
|
@RequestMapping("/")
|
public class LoginController {
|
|
private final AuthenticationManager authenticationManager;
|
private final SecurityUtils securityUtils;
|
private final PasswordEncoder passwordEncoder;
|
private final RedisAutoTemplate redisAutoTemplate;
|
private final MsgUtils msgUtils;
|
private final SecUserService secUserService;
|
@Autowired
|
private TOptometristService optometristService;
|
|
@Autowired
|
public LoginController(AuthenticationManager authenticationManager, SecurityUtils securityUtils, PasswordEncoder passwordEncoder, RedisAutoTemplate redisAutoTemplate, MsgUtils msgUtils, SecUserService secUserService) {
|
this.authenticationManager = authenticationManager;
|
this.securityUtils = securityUtils;
|
this.passwordEncoder = passwordEncoder;
|
this.redisAutoTemplate = redisAutoTemplate;
|
this.msgUtils = msgUtils;
|
this.secUserService = secUserService;
|
}
|
/**
|
* 登录接口
|
*/
|
@ApiOperation("验光师短信登录")
|
@PostMapping(value = "code/login")
|
public ApiResult<Map<String, Object>> loginByCode(@Validated @RequestBody LoginCodeDTO dto) {
|
TOptometrist one = optometristService.lambdaQuery().eq(TOptometrist::getPhone, dto.getPhone()).one();
|
if (one==null){
|
return ApiResult.failed(500, "手机号未注册");
|
}
|
TOptometrist two = optometristService.lambdaQuery().eq(TOptometrist::getPhone, dto.getPhone())
|
.eq(TOptometrist::getStatus, 2)
|
.one();
|
if (two!=null){
|
return ApiResult.failed(500, "账号已被禁用");
|
}
|
// 先检验是否登录
|
String phone = dto.getPhone();
|
String code = dto.getCode();
|
// 校验验证码是否正确
|
String redisCode = redisAutoTemplate.getStr(dto.getPhone());
|
Assert.isTrue(StringUtils.hasLength(redisCode), "验证码已过期");
|
if (!code.equals(redisCode)) {
|
throw new ServiceException(500, "验证码错误,请重新输入验证码!");
|
}
|
try {
|
Map<String, Object> token = securityUtils.login(phone, code, authenticationManager, SecurityUserDetails.class, 2);
|
return ApiResult.success(token);
|
} catch (Exception e) {
|
ApiResult<Map<String, Object>> failed = ApiResult.failed(new HashMap<>(1));
|
failed.setCode(0);
|
failed.setSuccess(false);
|
failed.setMsg(e.getMessage());
|
return failed;
|
}
|
}
|
|
|
@ApiOperation(value = "发送验证码", notes = "发送验证码")
|
@PostMapping(value = "sendMsg")
|
public ApiResult<String> sendMsg(@Validated @RequestBody VerificationCodeDTO dto) throws Exception {
|
// 发送验证码并存储到redis
|
if (StringUtils.hasLength(dto.getPhone())) {
|
SecUser one = secUserService.lambdaQuery().eq(SecUser::getPhone, dto.getPhone())
|
.eq(SecUser::getUserType, 2).one();
|
if (one==null){
|
return ApiResult.failed(500, "手机号未注册");
|
}
|
SecUser two = secUserService.lambdaQuery().eq(SecUser::getPhone, dto.getPhone())
|
.eq(SecUser::getUserType, 2)
|
.eq(SecUser::getState,0)
|
.one();
|
if (two==null){
|
return ApiResult.failed(500, "账号已被禁用");
|
}
|
|
String code = String.valueOf((int) (Math.random() * 1000000));
|
redisAutoTemplate.setStr(dto.getPhone(), code);
|
redisAutoTemplate.expire(dto.getPhone(), Constant.REDIS_EXPIRE);
|
msgUtils.sendMsg(dto.getPhone(), code);
|
return ApiResult.success("发送短信验证码成功!10分钟内有效");
|
}
|
return ApiResult.failed(500, "发送短信验证码失败,请确认手机号码!");
|
|
}
|
|
|
/**
|
* 退出
|
*
|
* @return 退出登录
|
*/
|
@ApiOperation("验光师退出登录")
|
@GetMapping("logout")
|
public ApiResult<String> logout() {
|
boolean flag = securityUtils.invalidateToken(WebUtils.request());
|
if (flag) {
|
return ApiResult.success("退出成功");
|
}
|
return ApiResult.success("退出失败");
|
}
|
|
/**
|
* h5登录
|
*/
|
/*@ApiOperation("h5登录")
|
@PostMapping(value = "h5/login")
|
public ApiResult<Map<String, Object>> webLogin(@Validated @RequestBody LoginDTO loginDto) {
|
// 先检验是否登录
|
String username = loginDto.getAccount();
|
String password = loginDto.getPassword();
|
EvaluatePerson evaluatePerson = evaluatePersonService.getOne(Wrappers.lambdaQuery(EvaluatePerson.class)
|
.eq(EvaluatePerson::getPersonAccount, username).last(" LIMIT 1"));
|
if (Objects.isNull(evaluatePerson)) {
|
throw new UsernameNotFoundException("该用户不存在");
|
}
|
// 根据加密算法加密用户输入的密码,然后和数据库中保存的密码进行比较
|
if (!passwordEncoder.matches(password, evaluatePerson.getPersonPassword())) {
|
throw new BadCredentialsException("输入账号或密码不正确");
|
}
|
try {
|
Map<String, Object> token = securityUtils.login(username, evaluatePerson, authenticationManager, EvaluatePerson.class,2);
|
String account = JwtTokenUtils.getUsername();
|
log.info("登录账号=============:{}",account);
|
return ApiResult.success(token);
|
} catch (Exception e) {
|
ApiResult<Map<String, Object>> failed = ApiResult.failed(new HashMap<>(1));
|
failed.setCode(0);
|
failed.setSuccess(false);
|
failed.setMsg(e.getMessage());
|
return failed;
|
}
|
}*/
|
|
}
|