From 46b10fb342044bca98842b31799212c2ca5223c6 Mon Sep 17 00:00:00 2001 From: ruibaby Date: Wed, 28 Aug 2019 08:04:54 +0800 Subject: [PATCH] Support menu team. --- .../java/run/halo/app/model/dto/MenuDTO.java | 3 ++ .../java/run/halo/app/model/entity/Menu.java | 10 +++++ .../freemarker/tag/MenuTagDirective.java | 7 ++++ .../run/halo/app/model/params/MenuParam.java | 4 ++ .../run/halo/app/model/vo/MenuTeamVO.java | 22 ++++++++++ .../halo/app/repository/MenuRepository.java | 5 +++ .../run/halo/app/service/MenuService.java | 19 +++++++++ .../app/service/impl/MenuServiceImpl.java | 40 +++++++++++++++++-- 8 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 src/main/java/run/halo/app/model/vo/MenuTeamVO.java diff --git a/src/main/java/run/halo/app/model/dto/MenuDTO.java b/src/main/java/run/halo/app/model/dto/MenuDTO.java index 8c8e4c2ab..cf18f90a7 100644 --- a/src/main/java/run/halo/app/model/dto/MenuDTO.java +++ b/src/main/java/run/halo/app/model/dto/MenuDTO.java @@ -10,6 +10,7 @@ import run.halo.app.model.entity.Menu; * Menu output dto. * * @author johnniang + * @author ryanwang * @date 4/3/19 */ @Data @@ -30,4 +31,6 @@ public class MenuDTO implements OutputConverter { private String icon; private Integer parentId; + + private String team; } diff --git a/src/main/java/run/halo/app/model/entity/Menu.java b/src/main/java/run/halo/app/model/entity/Menu.java index 2fc7db41d..8dc293ada 100644 --- a/src/main/java/run/halo/app/model/entity/Menu.java +++ b/src/main/java/run/halo/app/model/entity/Menu.java @@ -60,6 +60,12 @@ public class Menu extends BaseEntity { @Column(name = "parent_id", columnDefinition = "int default 0") private Integer parentId; + /** + * Menu team name. + */ + @Column(name = "team", columnDefinition = "varchar(255) default ''") + private String team; + @Override public void prePersist() { super.prePersist(); @@ -81,5 +87,9 @@ public class Menu extends BaseEntity { if (parentId == null) { parentId = 0; } + + if(team == null){ + team = ""; + } } } diff --git a/src/main/java/run/halo/app/model/freemarker/tag/MenuTagDirective.java b/src/main/java/run/halo/app/model/freemarker/tag/MenuTagDirective.java index ee13324e2..cb39621bd 100644 --- a/src/main/java/run/halo/app/model/freemarker/tag/MenuTagDirective.java +++ b/src/main/java/run/halo/app/model/freemarker/tag/MenuTagDirective.java @@ -43,6 +43,13 @@ public class MenuTagDirective implements TemplateDirectiveModel { case "tree": env.setVariable("menus", builder.build().wrap(menuService.listAsTree(Sort.by(DESC, "priority")))); break; + case "listTeams": + env.setVariable("teams", builder.build().wrap(menuService.listTeamVos(Sort.by(DESC, "priority")))); + break; + case "listByTeam": + String team = params.get("team").toString(); + env.setVariable("menus", builder.build().wrap(menuService.listByTeam(team, Sort.by(DESC, "priority")))); + break; case "count": env.setVariable("count", builder.build().wrap(menuService.count())); break; diff --git a/src/main/java/run/halo/app/model/params/MenuParam.java b/src/main/java/run/halo/app/model/params/MenuParam.java index 4788cad20..5334e2227 100644 --- a/src/main/java/run/halo/app/model/params/MenuParam.java +++ b/src/main/java/run/halo/app/model/params/MenuParam.java @@ -13,6 +13,7 @@ import javax.validation.constraints.Size; * Menu param. * * @author johnniang + * @author ryanwang * @date 4/3/19 */ @Data @@ -37,4 +38,7 @@ public class MenuParam implements InputConverter { private String icon; private Integer parentId; + + @Size(max = 255, message = "菜单分组的字符长度不能超过 {max}") + private String team; } diff --git a/src/main/java/run/halo/app/model/vo/MenuTeamVO.java b/src/main/java/run/halo/app/model/vo/MenuTeamVO.java new file mode 100644 index 000000000..166518a76 --- /dev/null +++ b/src/main/java/run/halo/app/model/vo/MenuTeamVO.java @@ -0,0 +1,22 @@ +package run.halo.app.model.vo; + +import lombok.Data; +import lombok.ToString; +import run.halo.app.model.dto.MenuDTO; + +import java.util.List; + +/** + * Menu team vo. + * + * @author ryanwang + * @date : 2019/8/28 + */ +@Data +@ToString +public class MenuTeamVO { + + private String team; + + private List menus; +} diff --git a/src/main/java/run/halo/app/repository/MenuRepository.java b/src/main/java/run/halo/app/repository/MenuRepository.java index f8c5ed7fc..16d092da9 100644 --- a/src/main/java/run/halo/app/repository/MenuRepository.java +++ b/src/main/java/run/halo/app/repository/MenuRepository.java @@ -1,5 +1,6 @@ package run.halo.app.repository; +import org.springframework.data.domain.Sort; import org.springframework.lang.NonNull; import run.halo.app.model.entity.Menu; import run.halo.app.repository.base.BaseRepository; @@ -10,6 +11,8 @@ import java.util.List; * Menu repository. * * @author johnniang + * @author ryanwang + * @date 2019-8-28 */ public interface MenuRepository extends BaseRepository { @@ -18,4 +21,6 @@ public interface MenuRepository extends BaseRepository { boolean existsByIdNotAndName(@NonNull Integer id, @NonNull String name); List findByParentId(@NonNull Integer id); + + List findByTeam(String team, Sort sort); } diff --git a/src/main/java/run/halo/app/service/MenuService.java b/src/main/java/run/halo/app/service/MenuService.java index 7633ede4d..defb6c36b 100644 --- a/src/main/java/run/halo/app/service/MenuService.java +++ b/src/main/java/run/halo/app/service/MenuService.java @@ -5,6 +5,7 @@ import org.springframework.lang.NonNull; import run.halo.app.model.dto.MenuDTO; import run.halo.app.model.entity.Menu; import run.halo.app.model.params.MenuParam; +import run.halo.app.model.vo.MenuTeamVO; import run.halo.app.model.vo.MenuVO; import run.halo.app.service.base.CrudService; @@ -28,6 +29,24 @@ public interface MenuService extends CrudService { @NonNull List listDtos(@NonNull Sort sort); + /** + * Lists menu team vos. + * + * @param sort must not be null + * @return a list of menu team vo + */ + @NonNull + List listTeamVos(@NonNull Sort sort); + + /** + * List menus by team. + * + * @param team team + * @param sort sort + * @return list of menus + */ + List listByTeam(@NonNull String team, Sort sort); + /** * Creates a menu. * diff --git a/src/main/java/run/halo/app/service/impl/MenuServiceImpl.java b/src/main/java/run/halo/app/service/impl/MenuServiceImpl.java index 8dc5cf010..d1981e6cd 100644 --- a/src/main/java/run/halo/app/service/impl/MenuServiceImpl.java +++ b/src/main/java/run/halo/app/service/impl/MenuServiceImpl.java @@ -9,15 +9,14 @@ import run.halo.app.exception.AlreadyExistsException; import run.halo.app.model.dto.MenuDTO; import run.halo.app.model.entity.Menu; import run.halo.app.model.params.MenuParam; +import run.halo.app.model.vo.MenuTeamVO; import run.halo.app.model.vo.MenuVO; import run.halo.app.repository.MenuRepository; import run.halo.app.service.MenuService; import run.halo.app.service.base.AbstractCrudService; import run.halo.app.utils.ServiceUtils; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -43,6 +42,41 @@ public class MenuServiceImpl extends AbstractCrudService implemen return convertTo(listAll(sort)); } + @Override + public List listTeamVos(Sort sort) { + Assert.notNull(sort, "Sort info must not be null"); + + // List all menus + List menus = listDtos(sort); + + // Get teams + Set teams = ServiceUtils.fetchProperty(menus, MenuDTO::getTeam); + + // Convert to team menu list map (Key: team, value: menu list) + Map> teamMenuListMap = ServiceUtils.convertToListMap(teams, menus, MenuDTO::getTeam); + + List result = new LinkedList<>(); + + // Wrap menu team vo list + teamMenuListMap.forEach((team, menuList) -> { + // Build menu team vo + MenuTeamVO menuTeamVO = new MenuTeamVO(); + menuTeamVO.setTeam(team); + menuTeamVO.setMenus(menuList); + + // Add it to result + result.add(menuTeamVO); + }); + + return result; + } + + @Override + public List listByTeam(String team, Sort sort) { + List menus = menuRepository.findByTeam(team, sort); + return menus.stream().map(menu -> (MenuDTO) new MenuDTO().convertFrom(menu)).collect(Collectors.toList()); + } + @Override public Menu createBy(MenuParam menuParam) { Assert.notNull(menuParam, "Menu param must not be null");