package com.xiaopeng.account.controller; import com.xiaopeng.account.constant.I18nKeyConstant; import com.xiaopeng.account.service.ISysGroupService; import com.xiaopeng.account.service.ISysUserService; import com.xiaopeng.account.service.IXpOperationsUserService; import com.xiaopeng.account.service.impl.SysLoginService; import com.xiaopeng.account.vo.LoginBody; import com.xiaopeng.account.vo.RegisterBody; import com.xiaopeng.api.dto.operation.*; import com.xiaopeng.api.feignClient.operation.SmsClient; import com.xiaopeng.api.model.account.SysRole; import com.xiaopeng.api.model.account.XpOperationsUser; import com.xiaopeng.api.vo.account.LoginOfficialPartnerUser; import com.xiaopeng.api.vo.account.LoginOperationUser; import com.xiaopeng.api.vo.account.LoginUser; import com.xiaopeng.api.vo.operation.SmsVo; import com.xiaopeng.common.core.constant.VerificationCodeConstants; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.common.core.utils.JwtUtils; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.common.redis.service.RedisService; import com.xiaopeng.common.security.auth.AuthUtil; import com.xiaopeng.common.security.service.TokenService; import com.xiaopeng.common.security.utils.SecurityUtils; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.concurrent.TimeUnit; /** * token 控制 * * @author xiaopeng */ @Slf4j @RestController public class TokenController { @Autowired private TokenService tokenService; @Autowired private SysLoginService sysLoginService; @Resource private ISysUserService sysUserService; @Resource private IXpOperationsUserService xpOperationsUserService; @Autowired private ISysGroupService sysGroupService; @Autowired private RedisService redisService; @Resource private SmsClient smsClient; @Value("${sms.appid}") private String sms_appid; // @Autowired // private EncryptionDecryptionUtil encryptionDecryptionUtil; @ApiOperation(value = "用户登录", tags = "管理后台-用户登录") @PostMapping("/base/v1/login") public R login(@RequestBody LoginBody form, HttpServletRequest request) { // 用户登录 LoginUser userInfo = sysLoginService.login(form.getUsername(), form.getPassword(), request); boolean phoneDesensitization = sysGroupService.getPhoneDesensitization(); userInfo.setPhoneDesensitizationExempt(phoneDesensitization); HashMap map = new HashMap<>(); map.put("token", tokenService.createToken(userInfo)); List roles = userInfo.getSysUser().getRoles(); // if (CollectionUtils.isEmpty(roles)) { // throw new ServiceException("请关联角色!", I18nKeyConstant.LOGIN_ROLE_NOT_BIND); // } // map.put("roleName",roles.get(0).getRoleName()); map.put("info", userInfo); // 修改用户最后登录时间 return R.ok(map); } /* @ApiOperation(value = "解密测试", tags = "管理后台-用户登录") @PostMapping("/base/v1/decrypted") public R decrypted(@RequestBody LoginBody form, HttpServletRequest request) { String decrypt = encryptionDecryptionUtil.decrypt(form.getUsername(), request); return R.ok(decrypt); } @ApiOperation(value = "加密测试", tags = "管理后台-用户登录") @GetMapping("/base/v1/encrypted") public R encrypted(HttpServletRequest request, HttpServletResponse response) { String content = "Hello, World!"; String sessionId = request.getSession(true).getId(); if(StringUtils.isEmpty(sessionId)){ throw new ServiceException("请求失败,请稍后重试", I18nKeyConstant.REQUEST_FAILED); } Object cacheObject = redisService.getCacheObject("session:id:" + sessionId); if (null != cacheObject) { JSONObject jsonObject = JSONObject.parseObject(cacheObject.toString()); return R.ok(jsonObject.getString("publicKey")); } KeyPair keyPair = RSAUtil.generateKeyPair(); String publicKey = RSAUtil.getPublicKey(keyPair); String privateKey = RSAUtil.getPrivateKey(keyPair); JSONObject jsonObject = new JSONObject(); jsonObject.put("publicKey", publicKey); jsonObject.put("privateKey", privateKey); redisService.setCacheObject("session:id:" + sessionId, jsonObject.toJSONString(), 1L, TimeUnit.MINUTES); JSONObject encrypt = EncryptionDecryptionUtil.encrypt(content, privateKey); response.setHeader("xps", encrypt.getString("aes_key")); return R.ok(encrypt.getString("content")); }*/ @ApiOperation(value = "账号密码登录", tags = {"运维APP登录"}) @PostMapping("/maintenance-app/base/v1/operationPasswordLogin") public R operationPasswordLogin(@RequestBody AppLoginPasswordDTO appLoginPasswordDTO, HttpServletRequest request) { // 用户登录 LoginOperationUser userInfo = sysLoginService.operationPasswordLogin(appLoginPasswordDTO.getPhoneNumber(), appLoginPasswordDTO.getPassword(), appLoginPasswordDTO.getDeviceType(), request); HashMap map = new HashMap<>(); map.put("token", tokenService.createOperationUserToken(userInfo)); // List roles = userInfo.getXpOperationsUser().getRoles(); // if (CollectionUtils.isEmpty(roles)) { // return R.fail("请关联角色!"); // } // map.put("roleName", roles.get(0).getRoleName()); map.put("info", userInfo); return R.ok(map); } @ApiOperation(value = "手机验证码登录", tags = {"运维APP登录"}) @PostMapping("/maintenance-app/base/v1/verificationCodeLogin") public R verificationCodeLogin(@RequestBody AppLoginCodeDTO appLoginCodeDTO, HttpServletRequest request) { // 用户登录 LoginOperationUser userInfo = sysLoginService.verificationCodeLogin(appLoginCodeDTO.getPhoneNumber(), appLoginCodeDTO.getVerificationCode(),appLoginCodeDTO.getDeviceType(), request); HashMap map = new HashMap<>(); map.put("token", tokenService.createOperationUserToken(userInfo)); // List roles = userInfo.getXpOperationsUser().getRoles(); // if (CollectionUtils.isEmpty(roles)) { // return R.fail("请关联角色!"); // } // map.put("roleName", roles.get(0).getRoleName()); map.put("info", userInfo); return R.ok(map); } @ApiOperation(value = "获取手机验证码", tags = {"运维APP登录"}) @PostMapping("/maintenance-app/base/v1/getVerificationCode") public R verificationCodeLogin(@RequestBody AppLoginGetCodeDTO appLoginPasswordDTO) { XpOperationsUser xpOperationsUser = xpOperationsUserService.lambdaQuery() .eq(XpOperationsUser::getPhoneNumber, appLoginPasswordDTO.getPhoneNumber()) .last("limit 1").one(); if (xpOperationsUser == null) { return R.fail("账号不存在!"); } if (!xpOperationsUser.getStatus()) { return R.fail("账号已禁用!"); } // 生成6位数短信验证码 String code = String.valueOf((int) (Math.random() * 1000000)); String codeType = ""; switch (appLoginPasswordDTO.getCodeType()) { case 1: codeType = VerificationCodeConstants.LOGIN_CODE; break; case 2: codeType = VerificationCodeConstants.FORGET_PASSWORD_CODE; break; case 3: codeType = VerificationCodeConstants.UPDATE_PASSWORD_CODE; break; } SmsVo vo = new SmsVo(); vo.setAppId(sms_appid); vo.setPushType(1); vo.setReceivers(appLoginPasswordDTO.getPhoneNumber()); vo.setTemplateCode("RobotaxiVerifyCodeSmsTpl"); vo.setAppPushConfigCode("RobotaxiVerifyCodeSms"); vo.setParams(new HashMap<>()); vo.getParams().put("code", code); SmsDto smsDto = smsClient.pushSms(vo); if(null == smsDto || smsDto.getCode() != 200){ throw new ServiceException("短信发送失败", I18nKeyConstant.SMS_PUSH_FAILED); } redisService.setCacheObject(codeType+appLoginPasswordDTO.getPhoneNumber(), code, 60L, TimeUnit.SECONDS); return R.ok(); } @ApiOperation(value = "修改密码", tags = {"运维APP登录"}) @PostMapping("/maintenance-app/base/v1/updatePassword") public R updatePassword(@RequestBody UpdatePasswordDTO updatePasswordDTO, HttpServletRequest request) { // 用户登录 if (sysLoginService.verificationCodeUpdate(updatePasswordDTO, request)){ return R.ok("修改成功,请重新登录"); }else{ return R.fail("修改失败"); } } @DeleteMapping("/api/v1/logout") public R logout(HttpServletRequest request) { String token = SecurityUtils.getToken(request); if (StringUtils.isNotEmpty(token)) { String username = JwtUtils.getUserName(token); // 删除用户缓存记录 AuthUtil.logoutByToken(token); // 记录用户退出日志 sysLoginService.logout(username, request); } return R.ok(); } @PostMapping("refresh") public R refresh(HttpServletRequest request) { LoginUser loginUser = tokenService.getLoginUser(request); if (StringUtils.isNotNull(loginUser)) { // 刷新令牌有效期 tokenService.refreshToken(loginUser); return R.ok(); } return R.ok(); } @PostMapping("register") public R register(@RequestBody RegisterBody registerBody, HttpServletRequest request) { // 用户注册 sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(), request); return R.ok(); } }