l2-admin 後臺管理系統

背景

之前做過一個spring cloud的腳手架,最近要做一個內部系統,所以又做了個簡單的基於springboot2.0+shiro+jwt+jpa的權限系統腳手架

l2-admin 後臺管理系統

項目簡介

l2admin 基於 Spring Boot 2.1.9 、 Jpa、mybatis, JWT、Shiro、Vue的前後端分離的後臺管理系統,
權限控制的方式爲RBAC,支持一鍵生成前後端代碼(採用golang編寫的命令行工具),支持前端菜單動態路由。

項目同時支持了mybatis和jpa,意在簡單的查詢使用jpa,複雜的多表聯查使用mybatis。同時項目將依賴控制儘可能少,以便更簡單的二次開發

項目預覽

http://dota2info.cn 用戶名/密碼:admin/123456

項目源碼

springboot後端服務

vue前端項目

項目腳手架(web一鍵生成工具已廢棄)

命令行腳手架

系統功能

  1. 用戶管理:提供用戶的相關配置

  2. 角色管理:對權限與菜單進行分配

  3. 菜單管理:已實現菜單動態路由,後端可配置化,支持多級菜單

  4. 路由管理:已實現動態路由,後端可配置化,支持多級路由

  5. 代碼生成:高靈活度一鍵生成前後端代碼(且可以複用於任何可以歸納爲模板的工程代碼,只需自己編寫模板),如果是單表的
    增刪改查,項目模板可以減少百分之99的工作任務

前端開發說明

  1. 路由的配置:除了在頁面上添加相應路由之外,還需要在 @/routeMapComponents/index.js文件下制定路由的路徑
  2. 如需獲取state中的值可以使用類似如下的代碼:
 computed: {
            ...mapState('d2admin/permission',[
                'ownRp','cols','orders','allRp'
            ])
        },
  1. 如需在請求時增加請求頭數據,可以在@/plugin/axios/index.js中配置所需的請求頭
  2. 本地後臺的地址的配置在.env.develpment中
  3. 前端默認隱藏了d2-admin的debug等菜單(但未刪除),如果需要請自行打開

後臺說明

  1. 同一的異常處理,如果需要向前臺返回錯誤,請使用如下代碼:
throw new BaseException("系統在初始化請稍後");
  1. jpa中如果需要動態構建關聯表的查詢,可以參考如下代碼:
SetJoin<User, Role> roleJoin = root.join(root.getModel().getSet("roles", Role.class), JoinType.LEFT);
 
predicates.add(criteriaBuilder.equal(roleJoin.get("id").as(String.class),baseSearch.getRoleId()));
  1. 當存在中間表時,如需使用jpa查詢,則可以如下配置:
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(name = "role_user",joinColumns = @JoinColumn(name="user_id",referencedColumnName = "id"),inverseJoinColumns = @JoinColumn(name = "role_id",referencedColumnName = "id"))
  @JsonIgnore
 private Set<Role> roles;
  1. 對樹形數據,從mysql表還原,代碼如下:

/**
 * @author lwydyby
 * @title: TreeUtils
 * @description: TODO
 * @date 2019-10-23 08:21
 */
public class TreeUtils {

    private static <T extends BaseTree> List<T> getMenuTreeList(List<T> menuList, String pid) {
        // 查找所有菜單
        List<T> childrenList = new ArrayList<>();
        menuList.stream()
                .filter(d ->{
                    if(pid==null){
                        return StringUtils.isEmpty(d.getParentId());
                    }else {
                        return Objects.equals(pid, d.getParentId());
                    }
                } )
                .collect(Collectors.toList())
                .forEach(d -> {
                    d.setChildren(getMenuTreeList(menuList,d.getId()));
                    childrenList.add(d);
                });
        return childrenList;
    }

    public static <T extends BaseTree> List<T> getMenuTreeList(List<T> menuList) {
        List<T> result=getMenuTreeList(menuList,null);
        sortTreeList(result);
        return result;
    }

    /**
     * 對菜單排序
     * @param menuList
     * @param <T>
     */
    private static <T extends BaseTree> void sortTreeList(List<T> menuList) {
        menuList.sort(Comparator.comparing(T::getSort));
        for(T t:menuList){
             if(t.getChildren()!=null&&t.getChildren().size()!=0){
                 sortTreeList(t.getChildren());
             }
        }
    }


}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章