package com.nova.sankuai.controller.v1; import com.alibaba.fastjson.JSONObject; import com.nova.sankuai.domain.dto.LoginUserDto; import com.nova.sankuai.domain.enums.SourceTypeEnum; import com.nova.sankuai.domain.vo.common.MessageCode; import com.nova.sankuai.infra.config.CommonException; import com.nova.sankuai.infra.constants.ResultCode; import com.nova.sankuai.infra.utils.IpUtil; import com.nova.sankuai.infra.utils.MessageCodeUtil; import com.nova.sankuai.infra.utils.ResultJson; import com.nova.sankuai.infra.utils.UserUtil; import com.nova.sankuai.service.IChannelInfoService; import com.nova.sankuai.service.ISysUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.apache.commons.lang.StringUtils; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Map; /** * @author weikangdi */ @Api(tags = "登录授权") @RestController @RequestMapping(value = "/api/v1/auth") @AllArgsConstructor public class AuthController { private final ISysUserService sysUserService; private final IChannelInfoService channelInfoService; @PostMapping(value = "/smsLogin") @ApiOperation(value = "手机验证码登录") public ResultJson smsLogin(@RequestBody LoginUserDto userDto) { if (!SourceTypeEnum.ADMIN.getCode().equals(userDto.getSource())) { ResultJson checkResult = channelInfoService.checkChannel(userDto.getAppId(), null); if (checkResult != null) { return checkResult; } } JSONObject token = sysUserService.smsLogin(userDto); return ResultJson.ok(token); } @GetMapping("/generate-verify-code") @ApiOperation("生成图形验证码") public ResponseEntity>> generateVerifyCode(String phone) throws IOException { if (!MessageCodeUtil.verifyPhone(phone)) { throw new CommonException("手机号不符合规范"); } ResponseEntity responseEntity = MessageCodeUtil.getGenerateImgCode(phone); return responseEntity; } @GetMapping("/code") @ApiOperation(value = "获取手机验证码") public ResultJson getCode(@RequestParam(value = "phone", required = false) String phone, @RequestParam(value = "source", required = false) Integer source, HttpServletRequest request, @RequestHeader(value = "verify-code", required = false) String verifyCode, @RequestParam(value = "inputVerifyCode", required = false) String inputVerifyCode) { if (StringUtils.isBlank(phone)) return ResultJson.failure(ResultCode.BAD_REQUEST, "phone 不能为空"); if (StringUtils.isBlank(verifyCode)) return ResultJson.failure(ResultCode.BAD_REQUEST, "请求头校验失败"); if (inputVerifyCode == null) return ResultJson.failure(ResultCode.BAD_REQUEST, "请求头校验失败"); if (source == null) return ResultJson.failure(ResultCode.BAD_REQUEST, "source 不能为空"); if (!MessageCodeUtil.verifyPhone(phone)) { throw new CommonException("手机号不符合规范"); } MessageCode code = MessageCodeUtil.getCode(phone); if (code != null) { boolean verifyImage = MessageCodeUtil.verifyImageCode(phone, verifyCode, inputVerifyCode); if (!verifyImage) { throw new CommonException("图片验证码错误"); } } String ip = IpUtil.getIpAddr(request); sysUserService.getCode(phone, source, ip); return ResultJson.success(); } @GetMapping(value = "/logout") @ApiOperation(value = "退出登录") @PreAuthorize("hasAuthority('auth.logout')") public ResultJson logout(HttpServletRequest request) { String token = request.getHeader("Authorization"); UserUtil.removeUserByToken(token); return ResultJson.success(); } }