通过若依源码分析多对多的实现过程
一. 引言
多对多的关系是一种很常见的实体间的关系。
除了多对多,还有一对多,多对一,一对一。
常见的有一对多和多对多,本文我就通过开源项目若依系统研究一下前端后端的多对多的实现方式,帮助那些还不太懂的代码如何编写的人,提供一种宝贵的借鉴思路。
代码使用的是若依的前端分离版本。项目地址:https://gitee.com/y_project/RuoYi-Vue
具体代码将展示用户和角色的实现方式。
二. 前端页面展示效果
- 用户新增可以选择角色信息,目前有两个,测试用户和普通用户。
- 用户编辑也可以修改原有的角色信息。
三. 数据库实现思路
- user表
主键user_id - role表
主键role_id
- user_role表(中间表,多对多的表)
联合主键user_id和role_id
四. 新增-后端实现思路
-
查看前端调用url
新增url http://localhost/dev-api/system/user/
-
controller层接收映射
新增映射为"/"
修改映射为"/{userId}"
注意:最新版本的若依已经对role加了一层判断过滤,加入isAdmin的判断。如果是admin查出所有角色,不是admin对role做了一层过滤。
1)AjaxResult.DATA_TAG是返回结果集合的外层,存入的是根据用户Id查询的user数据。
2)AjaxResult.success()返回集合中msg:“操作成功”,code:200
3)只看role数据,外层有一个roles的集合,所有role的数据集合,根据是否admin做数据筛选。
4)如果映射中有回传userId的话,外层会有一层rolesIds数据集合,存放根据userId查询roles数据集合。
/**
* 根据用户编号获取详细信息
*/
@PreAuthorize("@ss.hasPermi('system:user:query')")
@GetMapping(value = {
"/", "/{userId}" })
public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
{
AjaxResult ajax = AjaxResult.success();
List<SysRole> roles = roleService.selectRoleAll();
ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
ajax.put("posts", postService.selectPostAll());
if (StringUtils.isNotNull(userId))
{
ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId));
ajax.put("postIds", postService.selectPostListByUserId(userId));
ajax.