快速开发平台 fast_security_admin(二):动态Menu与Entity

快速开发平台 fast_security_admin(二):动态Menu与Entity

做了一点简单的更新,有通用接口确实好一点,但是用mybatis-plus也是很简单,所以到后期就把方法补齐不再用通用接口。

fast_security_admin在gitee地址

需求提出

  • 动态的menu。
  • 因为是后台系统,前端免不了有大量list,表数据可以用v-for渲染但是表头还要自己写,不方便,有大量重复工作!
  • 菜单绑定entity的id,通过entity_id查entity。

解决方案

数据库建menu表和entity表。

menu表:

在这里插入图片描述

entity表:

在这里插入图片描述

具体实现

很简单,利用mybatis-plus生成menu的类、entity的类。

需要的方法有

public interface MenuService extends IService<Menu> {

    /*
    * 获得status不为0的menu列表
    * */
    ServerResponse listMenu();
    /*
    * 根据parentid生成menu的树
    * */
    ServerResponse menuTree();
}

这里简单看一下生成树状结构的方法,用递归。

参考:Java递归生成树

@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {

    @Resource
    private MenuMapper menuMapper;

    @Override
    public ServerResponse menuTree() {
        //获得普通menu列表
        List<Menu> menus=menuMapper.listMenu();
        if(menus.size()==0){
            return ServerResponse.error(-1,"可用menu列表为空");
        }
        //生成menuTree
        List<MenuChildrenDTO> menuTree = createMenuTree(0, menus);
        return ServerResponse.succese(menuTree);
    }
    /*
    * 递归生成菜单树
    * 时间复杂度 O(n^2)?
    * */
    private List<MenuChildrenDTO> createMenuTree(int i, List<Menu> menus) {
        List<MenuChildrenDTO> treeMenu = new ArrayList<>();
        for (Menu menu : menus) {
            if (i == menu.getParentId()) {
                MenuChildrenDTO menuChildrenDTO=new MenuChildrenDTO();
                menuChildrenDTO.setMenu(menu);
                 menuChildrenDTO.setMenus(createMenuTree(menu.getId(),menus));
                treeMenu.add(menuChildrenDTO);
            }
        }
        return treeMenu;
    }
}

可以看到需要一个menuDTO

@Data
public class MenuChildrenDTO {
    private Menu menu;
    private List<MenuChildrenDTO> menus;//子节点
}

但是时间复杂度比较高,考虑优化算法,或者把生成树的过程放到前端完成!

时间复杂度好像是O(n^2),唉我太菜。

再看一下entity表以及它的方法和类,这里就用到了通用接口,还是比较方便的。

我们从菜单获取绑定的entity的id,然后通过

@GetMapping("getById/{entity}/{id}")
    public ServerResponse getById(@PathVariable("entity")String entity,@PathVariable("id")Integer id) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        //entity="entity" id=?
        return fastService.getById(entity,id);
    }

这个通用接口获得表头数据。

列表的填充数据再建实体类以及它的mapper、service就可以了,然后调用@GetMapping(“list/{entity}”)这个通用接口。

其他更新

做成了多模块项目,很简单,这样看着也比较清楚。

推荐一个开源项目:mall非常不错,是一个商城项目,有配套的教程,参考之后不一定要做商城,可以把权限部分方到自己的项目,它的权限部分后来又重写了变成了一个单独项目,推荐,没收钱哈哈。

mall作者的gitee

github太卡大家自己搜就好了。

欢迎大家关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值