Initial commit

This commit is contained in:
2023-06-10 23:57:03 +08:00
parent d6b795311f
commit 57e9cababa
31 changed files with 915 additions and 37 deletions

View File

@@ -20,6 +20,11 @@
<artifactId>service-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.atguigu</groupId>
<artifactId>spring-security</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
@@ -27,7 +32,7 @@
<scope>test</scope>
</dependency>
<!-- 代码生成器-->
<!-- 代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
@@ -49,5 +54,25 @@
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
</project>

View File

@@ -1,23 +1,33 @@
package com.atguigu.auth.controller;
import com.atguigu.auth.service.SysMenuService;
import com.atguigu.auth.service.SysUserService;
import com.atguigu.common.execption.GuiguException;
import com.atguigu.common.jwt.JwtHelper;
import com.atguigu.common.result.Result;
import com.atguigu.common.utils.MD5;
import com.atguigu.model.system.SysUser;
import com.atguigu.vo.system.LoginVo;
import com.atguigu.vo.system.RouterVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* ClassName: IndexController
* Package: com.atguigu.auth.controller
* 后台登录登出
*
* @author yovinchen
* @Create 2023/6/8 20:32
* 后台登录登出
*/
@Api(tags = "后台登录管理")
@RestController
@@ -25,6 +35,11 @@ import java.util.Map;
public class IndexController {
@Autowired
private SysMenuService sysMenuService;
@Autowired
private SysUserService sysUserService;
/**
* 登录
*
@@ -32,9 +47,29 @@ public class IndexController {
*/
@ApiOperation("登陆")
@PostMapping("login")
public Result login() {
public Result login(@RequestBody LoginVo loginVo) {
// Map<String, Object> map = new HashMap<>();
// map.put("token", "admin");
// return Result.ok(map);
//获取输入用户名和密码,根据用户名查询数据库
SysUser sysUser = sysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, loginVo.getUsername()));
//用户信息是否存在
if (sysUser == null) {
throw new GuiguException(201, "用户不存在");
}
//判断密码
if (!Objects.equals(sysUser.getPassword(), MD5.encrypt(loginVo.getPassword()))) {
throw new GuiguException(201, "密码错误");
}
//判断用户是否被禁用
if (sysUser.getStatus() == 0) {
throw new GuiguException(201, "用户已经被禁用,请联系管理员");
}
//利用 JWT 根据用户的id和用户名生成Token
Map<String, Object> map = new HashMap<>();
map.put("token", "admin");
map.put("token", JwtHelper.createToken(sysUser.getId(), sysUser.getUsername()));
//返回
return Result.ok(map);
}
@@ -45,11 +80,33 @@ public class IndexController {
*/
@ApiOperation("获取用户信息")
@GetMapping("info")
public Result info() {
public Result info(HttpServletRequest request) {
//获取请求头中Token字符串解密出用户信息
String token = request.getHeader("token");
//根据用户信息查询数据库,获取用户信息
Long userId =JwtHelper.getUserId(token);
SysUser sysUser = sysUserService.getById(userId);
//根据用户id获取用户可以操作菜单列表
//查询数据库,动态构建路由结构
List<RouterVo> routerList = sysMenuService.findUserMenuListByUserId(userId);
//根据用户id获取用户可以操作按钮列表
List<String> permsList = sysMenuService.findUserPermsByUserId(userId);
//返回相应数据
Map<String, Object> map = new HashMap<>();
map.put("roles", "[admin]");
map.put("name", "admin");
map.put("name", sysUser.getName());
map.put("avatar", "https://oss.aliyuncs.com/aliyun_id_photo_bucket/default_handsome.jpg");
// 返回用户可以操作的菜单
map.put("routers", routerList);
// 返回用户可以操作的按钮
map.put("buttons", permsList);
return Result.ok(map);
}

View File

@@ -34,9 +34,9 @@ public class SysMenuController {
* @return
*/
@ApiOperation(value = "根据角色获取菜单")
@GetMapping("toAssign/{roleId}")
@GetMapping("/toAssign/{roleId}")
public Result toAssign(@PathVariable Long roleId) {
List<SysMenu> list = sysMenuService.findSysMenuByRoleId(roleId);
List<SysMenu> list = sysMenuService.findMenuByRoleId(roleId);
return Result.ok(list);
}

View File

@@ -3,6 +3,7 @@ package com.atguigu.auth.controller;
import com.atguigu.auth.service.SysUserService;
import com.atguigu.common.result.Result;
import com.atguigu.common.utils.MD5;
import com.atguigu.model.system.SysUser;
import com.atguigu.vo.system.SysUserQueryVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -107,6 +108,8 @@ public class SysUserController {
@ApiOperation(value = "保存用户")
@PostMapping("save")
public Result save(@RequestBody SysUser user) {
//对密码进行MD5加密只能加密不能解密
user.setPassword(MD5.encrypt(user.getPassword()));
sysUserService.save(user);
return Result.ok();
}

View File

@@ -2,6 +2,9 @@ package com.atguigu.auth.mapper;
import com.atguigu.model.system.SysMenu;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
@@ -13,4 +16,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/
public interface SysMenuMapper extends BaseMapper<SysMenu> {
/**
* 多表关联查询:用户角色关系表、角色菜单关系表、菜单表
*
* @param userId
* @return
*/
List<SysMenu> findUserMenuListByUserId(@Param("userId") Long userId);
}

View File

@@ -1,5 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.atguigu.auth.mapper.SysMenuMapper">
<resultMap id="sysMenuMap"
type="com.atguigu.model.system.SysMenu" autoMapping="true">
</resultMap>
<select id="findUserMenuListByUserId" resultMap="sysMenuMap">
select distinct m.id,
m.parent_id,
m.name,
m.type,
m.path,
m.component,
m.perms,
m.icon,
m.sort_value,
m.status,
m.create_time,
m.update_time,
m.is_deleted
from sys_menu m
inner join sys_role_menu rm on rm.menu_id = m.id
inner join sys_user_role ur on ur.role_id = rm.role_id
where ur.user_id = #{userId}
and m.status = 1
and rm.is_deleted = 0
and ur.is_deleted = 0
and m.is_deleted = 0
</select>
</mapper>

View File

@@ -2,6 +2,7 @@ package com.atguigu.auth.service;
import com.atguigu.model.system.SysMenu;
import com.atguigu.vo.system.AssginMenuVo;
import com.atguigu.vo.system.RouterVo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
@@ -36,7 +37,7 @@ public interface SysMenuService extends IService<SysMenu> {
* @param roleId
* @return
*/
List<SysMenu> findSysMenuByRoleId(Long roleId);
List<SysMenu> findMenuByRoleId(Long roleId);
/**
* 给角色分配权限
@@ -44,4 +45,20 @@ public interface SysMenuService extends IService<SysMenu> {
* @param assignMenuVo
*/
void doAssign(AssginMenuVo assignMenuVo);
/**
* 获取用户操作菜单
*
* @param userId
* @return
*/
List<RouterVo> findUserMenuListByUserId(Long userId);
/**
* 获取用户操作按钮
*
* @param userId
* @return
*/
List<String> findUserPermsByUserId(Long userId);
}

View File

@@ -15,10 +15,18 @@ import java.util.Map;
*/
public interface SysRoleService extends IService<SysRole> {
//查询所有角色和当前用户所属角色
/**
* 查询所有角色和当前用户所属角色
*
* @param userId
* @return
*/
Map<String, Object> findRoleByUserId(Long userId);
//为用户分配角色
/**
* 为用户分配角色
*
* @param assginRoleVo
*/
void doAssign(AssginRoleVo assginRoleVo);
}

View File

@@ -20,4 +20,12 @@ public interface SysUserService extends IService<SysUser> {
* @param status
*/
void updateStatus(Long id, Integer status);
/**
* 根据用户名进行查询
*
* @param username
* @return
*/
SysUser getByUsername(String username);
}

View File

@@ -1,18 +1,23 @@
package com.atguigu.auth.service.impl;
import com.atguigu.auth.mapper.SysMenuMapper;
import com.atguigu.auth.mapper.SysRoleMenuMapper;
import com.atguigu.auth.service.SysMenuService;
import com.atguigu.auth.service.SysRoleMenuService;
import com.atguigu.auth.utils.MenuHelper;
import com.atguigu.common.execption.GuiguException;
import com.atguigu.model.system.SysMenu;
import com.atguigu.model.system.SysRoleMenu;
import com.atguigu.vo.system.AssginMenuVo;
import com.atguigu.vo.system.MetaVo;
import com.atguigu.vo.system.RouterVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@@ -27,8 +32,8 @@ import java.util.stream.Collectors;
@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {
private SysRoleMenuMapper sysRoleMenuMapper;
@Autowired
private SysRoleMenuService sysRoleMenuService;
/**
* 菜单列表
@@ -71,24 +76,36 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
* @return
*/
@Override
public List<SysMenu> findSysMenuByRoleId(Long roleId) {
//查询所有菜单
List<SysMenu> allSysMenuList = this.list(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getStatus, 1));
public List<SysMenu> findMenuByRoleId(Long roleId) {
//1 查询所有菜单- 添加条件 status=1
//在角色菜单关系表中根据角色id获取角色对应的所有菜单id
List<SysRoleMenu> sysRoleMenuList = sysRoleMenuMapper.selectList(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId));
//根据获取菜单id获取对应菜单对象
// LambdaQueryWrapper<SysMenu> wrapperSysMenu = new LambdaQueryWrapper<>();
// wrapperSysMenu.eq(SysMenu::getStatus, 1);
// List<SysMenu> allSysMenuList = baseMapper.selectList(wrapperSysMenu);
List<SysMenu> allSysMenuList = baseMapper.selectList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getStatus, 1));
//2 根据角色id roleId查询 角色菜单关系表里面 角色id对应所有的菜单id
// LambdaQueryWrapper<SysRoleMenu> wrapperSysRoleMenu = new LambdaQueryWrapper<>();
// wrapperSysRoleMenu.eq(SysRoleMenu::getRoleId, roleId);
// List<SysRoleMenu> sysRoleMenuList = sysRoleMenuService.list(wrapperSysRoleMenu);
List<SysRoleMenu> sysRoleMenuList = sysRoleMenuService.list(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, roleId));
//3 根据获取菜单id获取对应菜单对象
List<Long> menuIdList = sysRoleMenuList.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList());
//根据菜单id和所有菜单集合中id比较相同则封装
allSysMenuList.forEach(permission -> {
if (menuIdList.contains(permission.getId())) {
permission.setSelect(true);
//3.1 拿着菜单id 和所有菜单集合里面id进行比较如果相同封装
allSysMenuList.forEach(item -> {
if (menuIdList.contains(item.getId())) {
item.setSelect(true);
} else {
permission.setSelect(false);
item.setSelect(false);
}
});
//返回规定格式的菜单列表
return MenuHelper.buildTree(allSysMenuList);
//4 返回规定树形显示格式菜单列表
List<SysMenu> sysMenuList = MenuHelper.buildTree(allSysMenuList);
return sysMenuList;
}
/**
@@ -99,7 +116,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
@Override
public void doAssign(AssginMenuVo assignMenuVo) {
//根据角色id 删除菜单角色表 分配数据
sysRoleMenuMapper.delete(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, assignMenuVo.getRoleId()));
sysRoleMenuService.remove(new LambdaQueryWrapper<SysRoleMenu>().eq(SysRoleMenu::getRoleId, assignMenuVo.getRoleId()));
//从参数里面获取角色新分配菜单id列表
//进行遍历把每个id 数据添加菜单角色表
for (Long menuId : assignMenuVo.getMenuIdList()) {
@@ -107,8 +124,132 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
SysRoleMenu rolePermission = new SysRoleMenu();
rolePermission.setRoleId(assignMenuVo.getRoleId());
rolePermission.setMenuId(menuId);
sysRoleMenuMapper.insert(rolePermission);
sysRoleMenuService.save(rolePermission);
}
}
/**
* 获取用户操作菜单
*
* @param userId
* @return
*/
@Override
public List<RouterVo> findUserMenuListByUserId(Long userId) {
List<SysMenu> sysMenusList = null;
// 1、判断当前用户是否是管理员 userId=1 是管理员
// 1.1、 如果是管理员,查询所有菜单列表
if (userId == 1) {
// 查询所有菜单列表
sysMenusList = baseMapper.selectList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getStatus, 1).orderByAsc(SysMenu::getSortValue));
} else {
// 1.2、如果不是管理员,根据 userId 查询可以操作菜单列表
// 多表关联查询:sys_role、sys_role_menu、sys_menu
sysMenusList = baseMapper.findUserMenuListByUserId(userId);
}
// 2、把查询出来的数据列表 构建成框架要求的路由结构
// 先构建树形结构
List<SysMenu> sysMenuTreeList = MenuHelper.buildTree(sysMenusList);
// 构建框架要求的路由结构
return this.buildRouter(sysMenuTreeList);
}
/**
* 构建框架要求的路由结构
*
* @param menus
* @return
*/
private List<RouterVo> buildRouter(List<SysMenu> menus) {
// 创建 list 集合,存值最终数据
List<RouterVo> routers = new ArrayList<>();
// menus 遍历
for (SysMenu menu : menus) {
RouterVo router = new RouterVo();
router.setHidden(false);
router.setAlwaysShow(false);
router.setPath(getRouterPath(menu));
router.setComponent(menu.getComponent());
router.setMeta(new MetaVo(menu.getName(), menu.getIcon()));
// 下一层数据
List<SysMenu> children = menu.getChildren();
if (menu.getType() == 1) {
// 加载隐藏路由
List<SysMenu> hiddenMenuList = children.stream()
.filter(item -> !StringUtils.isEmpty(item.getComponent()))
.collect(Collectors.toList());
for (SysMenu hiddenMenu : hiddenMenuList) {
RouterVo hiddenRouter = new RouterVo();
hiddenRouter.setHidden(true);
hiddenRouter.setAlwaysShow(false);
hiddenRouter.setPath(getRouterPath(hiddenMenu));
hiddenRouter.setComponent(hiddenMenu.getComponent());
hiddenRouter.setMeta(new MetaVo(hiddenMenu.getName(), hiddenMenu.getIcon()));
routers.add(hiddenRouter);
}
} else {
if (!CollectionUtils.isEmpty(children)) {
if (children.size() > 0) {
router.setAlwaysShow(true);
}
// 递归
router.setChildren(buildRouter(children));
}
}
routers.add(router);
}
return routers;
}
/**
* 获取路由地址
*
* @param menu 菜单信息
* @return 路由地址
*/
public String getRouterPath(SysMenu menu) {
String routerPath = "/" + menu.getPath();
if (menu.getParentId().intValue() != 0) {
routerPath = menu.getPath();
}
return routerPath;
}
/**
* 获取用户操作按钮
*
* @param userId
* @return
*/
@Override
public List<String> findUserPermsByUserId(Long userId) {
// 1、判断是否是管理员如果是管理员查询所有按钮列表
List<SysMenu> sysMenusList = null;
if (userId == 1) {
// 查询所有菜单列表
sysMenusList = baseMapper.selectList(new LambdaQueryWrapper<SysMenu>().eq(SysMenu::getStatus, 1));
} else {
// 2、如果不是管理员根据userId查询可以操作按钮列表
// 多表关联查询:sys_role、sys_role_menu、sys_menu
sysMenusList = baseMapper.findUserMenuListByUserId(userId);
}
// 3、从查询出来的数据里面获取可以操作按钮值的List集合返回
// List<String> resultList = new ArrayList<>();
// for (SysMenu item : sysMenusList) {
// if (item.getType() == 2) {
// resultList.add(item.getPerms());
// }
// }
// return resultList;
return sysMenusList.stream()
.filter(item -> item.getType() == 2)
.map(SysMenu::getPerms)
.collect(Collectors.toList());
}
}

View File

@@ -3,6 +3,7 @@ package com.atguigu.auth.service.impl;
import com.atguigu.auth.mapper.SysUserMapper;
import com.atguigu.auth.service.SysUserService;
import com.atguigu.model.system.SysUser;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -37,4 +38,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
}
baseMapper.updateById(sysUser);
}
/**
* 根据用户名进行查询
*
* @param username
* @return
*/
@Override
public SysUser getByUsername(String username) {
return baseMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, username));
}
}

View File

@@ -0,0 +1,39 @@
package com.atguigu.auth.service.impl;
import com.atguigu.auth.service.SysUserService;
import com.atguigu.model.system.SysUser;
import com.atguigu.security.custom.CustomUser;
import com.atguigu.security.custom.UserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import java.util.Collections;
/**
* ClassName: UserDetailsServiceImpl
* Package: com.atguigu.auth.service.impl
*
* @author yovinchen
* @Create 2023/6/10 23:31
*/
@Component
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private SysUserService sysUserService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
SysUser sysUser = sysUserService.getByUsername(username);
if(null == sysUser) {
throw new UsernameNotFoundException("用户名不存在!");
}
if(sysUser.getStatus() == 0) {
throw new RuntimeException("账号已停用");
}
return new CustomUser(sysUser, Collections.emptyList());
}
}

View File

@@ -4,6 +4,8 @@ mybatis-plus:
configuration:
# 查看日志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:com/atguigu/auth/mapper/xml/*.xml
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource