wangjinhao_branch
wangjinhao 9 months ago
parent dae45cc1bc
commit 02778a84e0

@ -0,0 +1,143 @@
/*
* Copyright (c) 2018-2999 广 All rights reserved.
*
* https://www.mall4j.com/
*
*
*
*
*/
package com.yami.shop.admin.controller; // 定义类所在的包
import cn.hutool.core.util.StrUtil; // 引入Hutool工具类库中的StrUtil工具类用于字符串操作
import com.anji.captcha.model.common.ResponseModel; // 引入验证码响应模型
import com.anji.captcha.model.vo.CaptchaVO; // 引入验证码模型
import com.anji.captcha.service.CaptchaService; // 引入验证码服务
import com.baomidou.mybatisplus.core.toolkit.Wrappers; // 引入MyBatis-Plus工具类Wrappers
import com.yami.shop.common.exception.YamiShopBindException; // 引入自定义异常类
import com.yami.shop.common.response.ServerResponseEntity; // 引入服务器响应实体类
import com.yami.shop.security.admin.dto.CaptchaAuthenticationDTO; // 引入验证码认证DTO
import com.yami.shop.security.common.bo.UserInfoInTokenBO; // 引入用户信息类
import com.yami.shop.security.common.enums.SysTypeEnum; // 引入系统类型枚举
import com.yami.shop.security.common.manager.PasswordCheckManager; // 引入密码校验管理类
import com.yami.shop.security.common.manager.PasswordManager; // 引入密码管理类
import com.yami.shop.security.common.manager.TokenStore; // 引入Token存储管理类
import com.yami.shop.security.common.vo.TokenInfoVO; // 引入Token信息VO
import com.yami.shop.sys.constant.Constant; // 引入系统常量
import com.yami.shop.sys.model.SysMenu; // 引入系统菜单模型
import com.yami.shop.sys.model.SysUser; // 引入系统用户模型
import com.yami.shop.sys.service.SysMenuService; // 引入系统菜单服务
import com.yami.shop.sys.service.SysUserService; // 引入系统用户服务
import io.swagger.v3.oas.annotations.Operation; // 引入Swagger的Operation注解
import io.swagger.v3.oas.annotations.tags.Tag; // 引入Swagger的Tag注解
import org.springframework.beans.factory.annotation.Autowired; // 引入Spring的@Autowired注解
import org.springframework.web.bind.annotation.PostMapping; // 引入Spring的@PostMapping注解
import org.springframework.web.bind.annotation.RequestBody; // 引入Spring的@RequestBody注解
import org.springframework.web.bind.annotation.RestController; // 引入Spring的@RestController注解
import jakarta.validation.Valid; // 引入Jakarta Validation的Valid注解
import java.util.Arrays; // 引入Java的Arrays工具类
import java.util.List; // 引入Java的List接口
import java.util.Objects; // 引入Java的Objects工具类
import java.util.Set; // 引入Java的Set接口
import java.util.stream.Collectors; // 引入Java的Collectors工具类
/**
* AdminLoginController
*
* //Token
* @ FrozenWatermelon
* @ 2020/6/30
*/
@RestController // 标注这是一个控制器类并且其返回结果直接写入HTTP响应体中而不是视图名称
@Tag(name = "登录") // 给API文档添加标签描述这个控制器的功能
public class AdminLoginController {
@Autowired
private TokenStore tokenStore; // 自动注入Token存储管理类
@Autowired
private SysUserService sysUserService; // 自动注入系统用户服务
@Autowired
private SysMenuService sysMenuService; // 自动注入系统菜单服务
@Autowired
private PasswordCheckManager passwordCheckManager; // 自动注入密码校验管理类
@Autowired
private CaptchaService captchaService; // 自动注入验证码服务
@Autowired
private PasswordManager passwordManager; // 自动注入密码管理类
/**
* + ()
* //
* @param captchaAuthenticationDTO DTO
* @return Token
*/
@PostMapping("/adminLogin")
@Operation(summary = "账号密码 + 验证码登录(用于后台登录)" , description = "通过账号/手机号/用户名密码登录")
public ServerResponseEntity<?> login(
@Valid @RequestBody CaptchaAuthenticationDTO captchaAuthenticationDTO) {
// 登陆后台登录需要再校验一遍验证码
CaptchaVO captchaVO = new CaptchaVO();
captchaVO.setCaptchaVerification(captchaAuthenticationDTO.getCaptchaVerification());
ResponseModel response = captchaService.verification(captchaVO);
if (!response.isSuccess()) {
return ServerResponseEntity.showFailMsg("验证码有误或已过期");
}
SysUser sysUser = sysUserService.getByUserName(captchaAuthenticationDTO.getUserName());
if (sysUser == null) {
throw new YamiShopBindException("账号或密码不正确");
}
// 半小时内密码输入错误十次已限制登录30分钟
String decryptPassword = passwordManager.decryptPassword(captchaAuthenticationDTO.getPassWord());
passwordCheckManager.checkPassword(SysTypeEnum.ADMIN, captchaAuthenticationDTO.getUserName(), decryptPassword, sysUser.getPassword());
// 不是店铺超级管理员,并且是禁用状态,无法登录
if (Objects.equals(sysUser.getStatus(), 0)) {
// 未找到此用户信息
throw new YamiShopBindException("未找到此用户信息");
}
UserInfoInTokenBO userInfoInToken = new UserInfoInTokenBO();
userInfoInToken.setUserId(String.valueOf(sysUser.getUserId()));
userInfoInToken.setSysType(SysTypeEnum.ADMIN.value());
userInfoInToken.setEnabled(sysUser.getStatus() == 1);
userInfoInToken.setPerms(getUserPermissions(sysUser.getUserId()));
userInfoInToken.setNickName(sysUser.getUsername());
userInfoInToken.setShopId(sysUser.getShopId());
// 存储token返回vo
TokenInfoVO tokenInfoVO = tokenStore.storeAndGetVo(userInfoInToken);
return ServerResponseEntity.success(tokenInfoVO);
}
/**
*
* ID
* @param userId ID
* @return Set
*/
private Set<String> getUserPermissions(Long userId) {
List<String> permsList;
//系统管理员,拥有最高权限
if(userId == Constant.SUPER_ADMIN_ID){
List<SysMenu> menuList = sysMenuService.list(Wrappers.emptyWrapper());
permsList = menuList.stream().map(SysMenu::getPerms).collect(Collectors.toList());
}else{
permsList = sysUserService.queryAllPerms(userId);
}
return permsList.stream().flatMap((perms) -> {
if (StrUtil.isBlank(perms)) {
return null;
}
return Arrays.stream(perms.trim().split(StrUtil.COMMA));
}
).collect(Collectors.toSet());
}
}
Loading…
Cancel
Save