package com.jilongda.manage.authority.controller; import com.jilongda.manage.authority.dto.LoginDTO; import com.jilongda.manage.authority.model.SecUser; import com.jilongda.manage.model.TStore; import com.jilongda.manage.service.TStoreService; import com.jilongda.manage.utils.MsgUtils; 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.manage.authority.dto.LoginCodeDTO; import com.jilongda.manage.authority.dto.VerificationCodeDTO; import com.jilongda.manage.authority.service.SecUserService; import com.jilongda.manage.security.SecurityUserDetails; 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 TStoreService storeService; @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; } /** * 登录接口 */ @OperLoginLog @ApiOperation("后台登录") @PostMapping(value = "login") public ApiResult> login(@Validated @RequestBody LoginDTO loginDto) { //验证是否通过验证 // if (ObjectUtils.isEmpty(loginDto.getVerify()) || !loginDto.getVerify()) { // ApiResult> failed = new ApiResult<>(); // failed.setMsg("登录失败,请正确验证!"); // return failed; // } // 先检验是否登录 String username = loginDto.getAccount(); String password = loginDto.getPassword(); // 超级管理员不做校验 if (!username.equals("admin")){ SecUser user = secUserService.lambdaQuery().eq(SecUser::getAccount, username).one(); TStore store = storeService.getById(user.getStoreId()); if (store==null){ return ApiResult.failed(500, "门店不存在"); } if (store.getStatus() == 2){ return ApiResult.failed(500, "门店已被禁用"); } } try { Map token = securityUtils.login(username, password, authenticationManager, SecurityUserDetails.class, 1); return ApiResult.success(token); } catch (Exception e) { ApiResult> failed = ApiResult.failed(new HashMap<>(1)); failed.setCode(0); failed.setSuccess(false); failed.setMsg(e.getMessage()); return failed; } } /** * 登录接口 */ @ApiOperation("后台短信登录") @PostMapping(value = "code/login") public ApiResult> loginByCode(@Validated @RequestBody LoginCodeDTO dto) { // 先检验是否登录 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 token = securityUtils.login(phone, code, authenticationManager, SecurityUserDetails.class, 2); return ApiResult.success(token); } catch (Exception e) { ApiResult> 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 sendMsg(@Validated @RequestBody VerificationCodeDTO dto) throws Exception { // 发送验证码并存储到redis if (StringUtils.hasLength(dto.getPhone())) { 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 logout() { boolean flag = securityUtils.invalidateToken(WebUtils.request()); if (flag) { return ApiResult.success("退出成功"); } return ApiResult.success("退出失败"); } /** * h5登录 */ /*@ApiOperation("h5登录") @PostMapping(value = "h5/login") public ApiResult> 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 token = securityUtils.login(username, evaluatePerson, authenticationManager, EvaluatePerson.class,2); String account = JwtTokenUtils.getUsername(); log.info("登录账号=============:{}",account); return ApiResult.success(token); } catch (Exception e) { ApiResult> failed = ApiResult.failed(new HashMap<>(1)); failed.setCode(0); failed.setSuccess(false); failed.setMsg(e.getMessage()); return failed; } }*/ }