背景
之前做過一個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
項目源碼
系統功能
-
用戶管理:提供用戶的相關配置
-
角色管理:對權限與菜單進行分配
-
菜單管理:已實現菜單動態路由,後端可配置化,支持多級菜單
-
路由管理:已實現動態路由,後端可配置化,支持多級路由
-
代碼生成:高靈活度一鍵生成前後端代碼(且可以複用於任何可以歸納爲模板的工程代碼,只需自己編寫模板),如果是單表的
增刪改查,項目模板可以減少百分之99的工作任務
前端開發說明
- 路由的配置:除了在頁面上添加相應路由之外,還需要在 @/routeMapComponents/index.js文件下制定路由的路徑
- 如需獲取state中的值可以使用類似如下的代碼:
computed: {
...mapState('d2admin/permission',[
'ownRp','cols','orders','allRp'
])
},
- 如需在請求時增加請求頭數據,可以在@/plugin/axios/index.js中配置所需的請求頭
- 本地後臺的地址的配置在.env.develpment中
- 前端默認隱藏了d2-admin的debug等菜單(但未刪除),如果需要請自行打開
後臺說明
- 同一的異常處理,如果需要向前臺返回錯誤,請使用如下代碼:
throw new BaseException("系統在初始化請稍後");
- 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()));
- 當存在中間表時,如需使用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;
- 對樹形數據,從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());
}
}
}
}