1、权限数据库设计:
五张表实现权限分配
用户表、角色表、菜单表、用户角色关系表、菜单角色关系表
思路:给角色分配菜单、给用户分配角色
资源中会给到.sql脚本
2、难点设计:
因为菜单采用的树形表所以需要去递归遍历给出递归遍历过程,其余的CRUD就不写啦
/**
* 使用递归方法建菜单
*
* @param treeNodes
* @return
*/
public List<PermissionShow> build2(List<PermissionShow> treeNodes) {
//创建list集合,用于数据最终封装
List<PermissionShow> trees = new ArrayList<>();
//把所有菜单list集合遍历,得到顶层菜单 pid=0菜单,设置level是1
for (PermissionShow treeNode : treeNodes) {
//得到顶层菜单 pid=0菜单
if ("0".equals(treeNode.getParentId())) {
//根据顶层菜单,向里面进行查询子菜单,封装到finalNode里面
trees.add(findChildren2(treeNode, treeNodes));
}
}
return trees;
}
/**
* 递归查找子节点
*
* @param treeNodes
* @return
*/
private PermissionShow findChildren2(PermissionShow treeNode, List<PermissionShow> treeNodes) {
//1 因为向一层菜单里面放二层菜单,二层里面还要放三层,把对象初始化
treeNode.setChildren(new ArrayList<PermissionShow>());
//2 遍历所有菜单list集合,进行判断比较,比较id和pid值是否相同
for (PermissionShow node : treeNodes) {
//判断 id和pid值是否相同
if (treeNode.getPermissionId().equals(node.getParentId())) {
//把查询出来的子菜单放到父菜单里面
treeNode.getChildren().add(findChildren2(node, treeNodes));
}
}
return treeNode;
}
都有哪些接口可以给大家罗列
package com.museum.controller.api;
import com.alibaba.fastjson.JSONObject;
import com.museum.base.BaseResponse;
import com.museum.entity.DO.User;
import com.museum.entity.DTO.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@Api(tags = "用户服务(注册、登陆、CRUD)")
public interface UserAPI {
/**
* 注册
* @return
*/
@ApiOperation("用户注册")
@PostMapping("register")
BaseResponse<JSONObject> userRegister(@RequestBody @ApiParam(name = "用户注册",value = "每个字段都是必填!!",required = true)
UserRegister userRegister);
/**
* 注册
* @return
*/
@ApiOperation("用户登陆")
@PostMapping("login")
BaseResponse<JSONObject> userLogin(HttpServletRequest request, @RequestBody @ApiParam(name = "登陆",value = "每个字段都必填!!",required = true)
UserLogin userLogin);
/**
* 根据token获取用户信息
* @param request
* @return
*/
@ApiOperation("根据token获取用户信息")
@GetMapping("getUserInfo")
BaseResponse<JSONObject>getMessage(HttpServletRequest request);
/**
* 退出登陆
* @return
*/
@ApiOperation("退出登陆")
@PostMapping("logout")
BaseResponse<JSONObject>logout(HttpServletRequest request);
/**
* 根据token获取用户菜单
* @return
*/
@ApiOperation("获取用户菜单")
@GetMapping("getMenu")
BaseResponse<JSONObject>getMenu(HttpServletRequest request);
/**
* 根据token获取用户个人信息
* @return
*/
// @ApiOperation("获取用户菜单")
// @Post
/**
* 注册 用户名和密码登陆
* @return
*/
@ApiOperation("用户登陆")
@PostMapping("loginById")
BaseResponse<JSONObject> userLoginByUserName(HttpServletRequest request, @RequestBody @ApiParam(name = "登陆",value = "每个字段都必填!!",required = true)
UserLoginByName userLogin);
/**
* 添加用户
* @return
*/
@ApiOperation("添加用户")
@PutMapping("addUser")
BaseResponse<JSONObject> AddUser(@RequestBody @ApiParam(name = "添加用户") UserAdd userAdd);
/**
* 查询所有用户
* @return
*/
@ApiOperation("查询所有用户")
@GetMapping("getAllUser")
BaseResponse<JSONObject> getAllUser();
/**
* 根据用户的userId 删除用户 同时删除关联的user_role表
* @return
*/
@ApiOperation("根据用户ID删除用户")
@DeleteMapping("deleteUser/{userId}")
BaseResponse<JSONObject> deleteId(@PathVariable("userId") String userId);
/**
* 查询所有用户
* @return
*/
@ApiOperation("条件分页查询")
@PostMapping("pageUserCondition/{current}/{limit}")
BaseResponse<JSONObject> getAllUser(@PathVariable long current, @PathVariable long limit,
@RequestBody(required = false )UserQuery userQuery);
/**
* 修改用户
* @return
*/
@ApiOperation("修改用户")
@PutMapping("/updateUser")
BaseResponse<JSONObject> updateUser(@RequestBody User user);
}
package com.museum.controller.api;
import com.alibaba.fastjson.JSONObject;
import com.museum.base.BaseResponse;
import com.museum.entity.DTO.role.RoleAdd;
import com.museum.entity.DTO.role.RoleUpdate;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
@Api(tags = "权限-角色管理")
public interface RoleApI {
/**
* 查询所有角色
* @return
*/
@ApiOperation("查询所有角色")
@GetMapping("getAllRole/{current}/{limit}")
BaseResponse<JSONObject> getAllRole(@PathVariable("current")Integer current, @PathVariable("limit")Integer limit);
/**
* 增加角色
* @return
*/
@ApiOperation("添加角色")
@PutMapping("addRole")
@Transactional
BaseResponse<JSONObject>addRole(@RequestBody RoleAdd roleAdd);
/**
* 删除角色
* 同时删除角色对应的表中 role_permission 相互对应的字段
* 如果这个角色 分配在了用户上 就不允许删除对应的 查询user_role 表
* @return
*/
@Transactional
@ApiOperation("删除角色")
@DeleteMapping("deleteRole")
BaseResponse<JSONObject>deleteRole(String roleId);
/**
* 修改角色权限
* @param roleUpdate
* @return
*/
@ApiOperation(value = "修改角色")
@PutMapping("/update")
BaseResponse<JSONObject> doAssign(@RequestBody RoleUpdate roleUpdate);
}