|
|
|
@ -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());
|
|
|
|
|
}
|
|
|
|
|
}
|