场景
SpringBoot+MySql+ElementUI实现一对多的数据库的设计以及增删改查的实现
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/107971394
上面讲了app应用对应权限实现一对多的逻辑。
如果一对多多的那层再是一对多的话要怎样设计。
比如白名单设计,一个白名单可以包含多个手机app,而每个app又对应多个权限。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
首先设计白名单表
主要靠白名单的编码实现与应用的一对多关联。
添加白名单数据
然后设计与白名单一对多的app表
添加几条数据
然后设计权限表
然后添加几条权限表数据
然后怎样将这三个表进行关联,其中用到了两个关联表,首先是白名单与app应用实现一对多的关联
设计关联表
通过白名单的编码与app表的id进行关联
添加几条关联数据
然后是实现应用表与权限表的一对多关联,设计关联表
其实这里的设计可以只实现appid与权限id的关联,这样的话就是用到两个关联表。
或者只用上面这一张关联表实现白名单-应用-权限的关联。
具体根据自己情况选择,这里为了避免数据错乱所以使用了两个关联表并且第二个关联表也设计如上,
添加几条关联表数据
这样关联就代表白名单编号为001的对应app的id为1和2的,而appid为1的又对应权限id为1和2的。
然后使用代码生成工具分别生成以上所有表的相关的代码。
然后在实体类中添加关联关系。
即白名单实体类中添加应用的list,构建出一对多的关系,在应用的实体类中添加权限的list,构建出一对多的关系。
白名单实体
public class YckzBaimingdan { private static final long serialVersionUID = 1L; /** id */ private Long id; /** 白名单编号 */ private String bmdbh; /** 白名单名称 */ private String bmdname; /** 创建日期 */ @JsonFormat(pattern = "yyyy-MM-dd") private Date cjrq; /** 创建人 */ private String cjr; /*** * 白名单中应用列表 */ private List<YckzBaimingdanApp> appList; }
省略get和set方法
应用实体
public class YckzBaimingdanApp { private static final long serialVersionUID = 1L; /** id */ private Long id; /** 白名单编号 */ private String bmdbh; /** app应用id */ private Long appid; /*** * 名称 */ private String name; /*** * 包名 */ private String packagename; /*** * 权限列表 */ private List<YckzBaimingdanQuanxian> quanxianList; }
省略get和set方法
然后在新增白名单的接口方法中
public AjaxResult add(@RequestBody YckzBaimingdan yckzBaimingdan) { //验证白名单编号是否存在 int count = yckzBaimingdanService.isExistYckzBaimingdan(yckzBaimingdan.getBmdbh()); if(count>0) { return AjaxResult.error("该编号已经存在"); } else{ //插入白名单表 yckzBaimingdan.setCjrq(new Date()); yckzBaimingdanService.insertYckzBaimingdan(yckzBaimingdan); //插入白名单-应用表 //必须有应用列表 List<YckzBaimingdanApp> appList = yckzBaimingdan.getAppList(); for (YckzBaimingdanApp app:appList) { app.setBmdbh(yckzBaimingdan.getBmdbh()); //必须有白名单编号和appid yckzBaimingdanAppService.insertYckzBaimingdanApp(app); //每个应用必须有权限列表 List<YckzBaimingdanQuanxian> quanxianList = app.getQuanxianList(); for (YckzBaimingdanQuanxian quanxian:quanxianList) { quanxian.setBaimingdanbh(yckzBaimingdan.getBmdbh()); quanxian.setAppid(app.getAppid()); //插入白名单-权限表 yckzBaimingdanQuanxianService.insertYckzBaimingdanQuanxian(quanxian); } } return AjaxResult.success("新增白名单成功"); } }
首先验证白名单编号唯一,然后插入到白名单表中数据,然后获取应用表的list,循环插入白名单的
编号和应用的id,应用id是前端通过请求应用表数据获取的id。然后在获取每个应用对应的权限的list
再循环插入白名单-应用-权限的关联表。
这样新增时只是新增一个或者两个关联表。
然后在进行获取白名单的详细信息时
public AjaxResult getInfo(@PathVariable("id") Long id) { //查询出白名单主表 YckzBaimingdan baimingdan = yckzBaimingdanService.selectYckzBaimingdanById(id); //查询出应用列表 List<YckzBaimingdanApp> appList = yckzBaimingdanAppService.selectYckzBaimingdanAppListByBh(baimingdan.getBmdbh()); for (YckzBaimingdanApp app:appList) { List<YckzBaimingdanQuanxian> quanxianList = yckzBaimingdanQuanxianService.selectYckzBaimingdanQuanxianListByBhAndId(baimingdan.getBmdbh(), app.getAppid()); app.setQuanxianList(quanxianList); } baimingdan.setAppList(appList); return AjaxResult.success(baimingdan); }
根据id获取白名单表的信息,再根据白名单的编号获取应用的list再循环应用list,根据白名单编号和应用id获取权限的list,再分别将其赋值给对应的主表的list,然后
将白名单主表对象返回。
在实现修改时
public AjaxResult edit(@RequestBody YckzBaimingdan yckzBaimingdan) { //修改白名单-应用表 //必须有应用列表 List<YckzBaimingdanApp> appList = yckzBaimingdan.getAppList(); for (YckzBaimingdanApp app:appList) { //每个应用必须有权限列表 List<YckzBaimingdanQuanxian> quanxianList = app.getQuanxianList(); for (YckzBaimingdanQuanxian quanxian:quanxianList) { quanxian.setBaimingdanbh(yckzBaimingdan.getBmdbh()); quanxian.setAppid(app.getAppid()); //修改白名单-权限表 yckzBaimingdanQuanxianService.updateYckzBaimingdanQuanxian(quanxian); } app.setBmdbh(yckzBaimingdan.getBmdbh()); //必须有白名单编号和appid yckzBaimingdanAppService.updateYckzBaimingdanApp(app); } //修改白名单表 yckzBaimingdanService.updateYckzBaimingdan(yckzBaimingdan); return AjaxResult.success("修改白名单成功"); }
首先获取白名单下的应用列表然后循环获取每一个下的权限列表,然后在循环中
先修改权限表,循环完之后再修改应用表,再循环接受后修改白名单表。
更新时要采用逆序即从里向外的顺序进行修改,先修改多的那端再修改一的那端。
不然将一的那端修改后找不到对应的多的那端的信息了。
修改的是两个关联表的数据,不用修改应用信息表和权限信息表。
然后在删除时跟修改类似也是逆序的方式
public AjaxResult remove(@PathVariable Long[] ids) { for (Long id:ids) { //查询主表 YckzBaimingdan baimingdan = yckzBaimingdanService.selectYckzBaimingdanById(id); //查询出应用列表 List<YckzBaimingdanApp> appList1 = yckzBaimingdanAppService.selectYckzBaimingdanAppListByBh(baimingdan.getBmdbh()); for (YckzBaimingdanApp app:appList1) { List<YckzBaimingdanQuanxian> quanxianList = yckzBaimingdanQuanxianService.selectYckzBaimingdanQuanxianListByBhAndId(baimingdan.getBmdbh(), app.getAppid()); app.setQuanxianList(quanxianList); } baimingdan.setAppList(appList1); //获取应用列表 List<YckzBaimingdanApp> appList = baimingdan.getAppList(); for (YckzBaimingdanApp app:appList) { //每个应用必须有权限列表 List<YckzBaimingdanQuanxian> quanxianList = app.getQuanxianList(); for (YckzBaimingdanQuanxian quanxian:quanxianList) { quanxian.setBaimingdanbh(baimingdan.getBmdbh()); quanxian.setAppid(app.getAppid()); //删除白名单-权限表 yckzBaimingdanQuanxianService.deleteYckzBaimingdanQuanxianById(quanxian.getId()); } app.setBmdbh(baimingdan.getBmdbh()); yckzBaimingdanAppService.deleteYckzBaimingdanAppById(app.getId()); } yckzBaimingdanService.deleteYckzBaimingdanById(baimingdan.getId()); } return AjaxResult.success("删除白名单成功"); }