You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
2.6 KiB
Java

package cn.zyp.stusystem.controller;
import cn.dev33.satoken.stp.StpUtil;
import cn.zyp.stusystem.common.Result;
import cn.zyp.stusystem.dto.LoginDTO;
import cn.zyp.stusystem.entity.User;
import cn.zyp.stusystem.service.RoleService;
import cn.zyp.stusystem.service.UserService;
import cn.zyp.stusystem.vo.LoginResult;
import cn.zyp.stusystem.vo.UserVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/api")
public class LoginController {
@Autowired
private UserService userService;
@Autowired
private RoleService roleService;
@PostMapping("/login")
public Result<LoginResult> login(@RequestBody LoginDTO loginDTO) {
// 1. 根据用户名查询用户信息
User user = userService.getByUsername(loginDTO.getUsername());
// 2. 校验用户是否存在以及密码是否正确
if(user == null || !user.getPassword().equals(loginDTO.getPassword())) {
return Result.error(401, "用户名或密码错误");
}
// 3. SaToken登录自动生成token
StpUtil.login(user.getId());
// 4. 获取用户权限(从数据库获取,而不是从常量)
List<String> permissions = userService.getUserPermissions(user.getId());
// 5. 获取角色ID如果user中没有roleId则根据role查找
Long roleId = user.getRoleId();
if (roleId == null && user.getRole() != null) {
roleId = roleService.getRoleIdByRoleCode(user.getRole());
}
// 6. 在Session中存储角色和权限
StpUtil.getSession().set("role", user.getRole());
StpUtil.getSession().set("permissions", permissions);
if (roleId != null) {
StpUtil.getSession().set("roleId", roleId);
}
// 7. 构建返回数据
UserVO userVO = new UserVO();
userVO.setId(user.getId());
userVO.setUsername(user.getUsername());
userVO.setRole(user.getRole());
userVO.setRoleId(roleId != null ? roleId.toString() : null); // 转换为字符串,前端需要
userVO.setName(user.getName());
userVO.setPermissions(permissions);
LoginResult loginResult = new LoginResult();
loginResult.setToken(StpUtil.getTokenValue());
loginResult.setUserInfo(userVO);
return Result.success(loginResult);
}
}