Commit c09a7648 by fengshuonan

增加菜单的分类

parent 8bbd7d33
......@@ -70,6 +70,11 @@ public class MenuNode implements Comparable, Serializable {
private String icon;
/**
* 系统类型
*/
private String systemType;
/**
* 子节点的集合
*/
private List<MenuNode> children;
......
......@@ -19,6 +19,7 @@ import lombok.Data;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息
......@@ -76,4 +77,9 @@ public class ShiroUser implements Serializable {
*/
private List<String> roleNames;
/**
* 系统标识集合
*/
private List<Map<String, Object>> systemTypes;
}
......@@ -24,7 +24,7 @@ import cn.stylefeng.guns.sys.core.shiro.service.UserAuthService;
import cn.stylefeng.guns.sys.modular.system.entity.User;
import cn.stylefeng.guns.sys.modular.system.mapper.MenuMapper;
import cn.stylefeng.guns.sys.modular.system.mapper.UserMapper;
import cn.stylefeng.guns.sys.modular.system.service.UserService;
import cn.stylefeng.guns.sys.modular.system.service.DictService;
import cn.stylefeng.roses.core.util.SpringContextHolder;
import org.apache.shiro.authc.CredentialsException;
import org.apache.shiro.authc.LockedAccountException;
......@@ -38,6 +38,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Service
@DependsOn("springContextHolder")
......@@ -51,7 +52,7 @@ public class UserAuthServiceServiceImpl implements UserAuthService {
private MenuMapper menuMapper;
@Autowired
private UserService userService;
private DictService dictService;
public static UserAuthService me() {
return SpringContextHolder.getBean(UserAuthService.class);
......@@ -91,6 +92,13 @@ public class UserAuthServiceServiceImpl implements UserAuthService {
shiroUser.setRoleList(roleList);
shiroUser.setRoleNames(roleNameList);
//根据角色获取系统的类型
List<String> systemTypes = this.menuMapper.getMenusTypesByRoleIds(roleList);
//通过字典编码
List<Map<String, Object>> dictsByCodes = dictService.getDictsByCodes(systemTypes);
shiroUser.setSystemTypes(dictsByCodes);
return shiroUser;
}
......
......@@ -185,6 +185,19 @@ public class DictController extends BaseController {
}
/**
* 获取某个字典类型下的所有字典
*
* @author stylefeng
* @Date 2019-03-13
*/
@ResponseBody
@RequestMapping("/listDictsByCode")
public ResponseData listDictsByCode(@RequestParam("dictTypeCode") String dictTypeCode) {
List<Dict> dicts = this.dictService.listDictsByCode(dictTypeCode);
return new SuccessResponseData(dicts);
}
/**
* 获取某个类型下字典树的列表,ztree格式
*
* @author fengshuonan
......
......@@ -15,7 +15,6 @@
*/
package cn.stylefeng.guns.sys.modular.system.controller;
import cn.stylefeng.guns.base.pojo.node.MenuNode;
import cn.stylefeng.guns.base.shiro.ShiroUser;
import cn.stylefeng.guns.sys.core.exception.InvalidKaptchaException;
import cn.stylefeng.guns.sys.core.log.LogManager;
......@@ -35,6 +34,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.List;
import java.util.Map;
import static cn.stylefeng.roses.core.util.HttpContext.getIp;
......@@ -69,7 +69,7 @@ public class LoginController extends BaseController {
return "/login.html";
}
List<MenuNode> menus = userService.getUserMenuNodes(roleList);
List<Map<String, Object>> menus = userService.getUserMenuNodes(roleList);
model.addAttribute("menus", menus);
return "/index.html";
......
package cn.stylefeng.guns.sys.modular.system.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
......@@ -14,6 +15,7 @@ import java.util.Date;
* @since 2019-04-01
*/
@TableName("sys_menu")
@Data
public class Menu implements Serializable {
private static final long serialVersionUID = 1L;
......@@ -103,6 +105,12 @@ public class Menu implements Serializable {
private String openFlag;
/**
* 系统分类(字典)
*/
@TableField("system_type")
private String systemType;
/**
* 创建时间
*/
@TableField(value = "create_time", fill = FieldFill.INSERT)
......@@ -126,172 +134,4 @@ public class Menu implements Serializable {
@TableField(value = "update_user", fill = FieldFill.UPDATE)
private Long updateUser;
public Long getMenuId() {
return menuId;
}
public void setMenuId(Long menuId) {
this.menuId = menuId;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getPcode() {
return pcode;
}
public void setPcode(String pcode) {
this.pcode = pcode;
}
public String getPcodes() {
return pcodes;
}
public void setPcodes(String pcodes) {
this.pcodes = pcodes;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public Integer getLevels() {
return levels;
}
public void setLevels(Integer levels) {
this.levels = levels;
}
public String getMenuFlag() {
return menuFlag;
}
public void setMenuFlag(String menuFlag) {
this.menuFlag = menuFlag;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getNewPageFlag() {
return newPageFlag;
}
public void setNewPageFlag(String newPageFlag) {
this.newPageFlag = newPageFlag;
}
public String getOpenFlag() {
return openFlag;
}
public void setOpenFlag(String openFlag) {
this.openFlag = openFlag;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Long getCreateUser() {
return createUser;
}
public void setCreateUser(Long createUser) {
this.createUser = createUser;
}
public Long getUpdateUser() {
return updateUser;
}
public void setUpdateUser(Long updateUser) {
this.updateUser = updateUser;
}
@Override
public String toString() {
return "Menu{" +
"menuId=" + menuId +
", code=" + code +
", pcode=" + pcode +
", pcodes=" + pcodes +
", name=" + name +
", icon=" + icon +
", url=" + url +
", sort=" + sort +
", levels=" + levels +
", menuFlag=" + menuFlag +
", description=" + description +
", status=" + status +
", newPageFlag=" + newPageFlag +
", openFlag=" + openFlag +
", createTime=" + createTime +
", updateTime=" + updateTime +
", createUser=" + createUser +
", updateUser=" + updateUser +
"}";
}
}
......@@ -80,6 +80,15 @@ public interface MenuMapper extends BaseMapper<Menu> {
List<MenuNode> getMenusByRoleIds(List<Long> roleIds);
/**
* 根据角色获取菜单的类型列表
*
* @param roleIds
* @return
* @date 2019年07月11日16:26:27
*/
List<String> getMenusTypesByRoleIds(List<Long> roleIds);
/**
* 查询菜单树形列表
*
* @author fengshuonan
......
......@@ -4,24 +4,24 @@
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.stylefeng.guns.sys.modular.system.entity.Menu">
<id column="menu_id" property="menuId" />
<result column="code" property="code" />
<result column="pcode" property="pcode" />
<result column="pcodes" property="pcodes" />
<result column="name" property="name" />
<result column="icon" property="icon" />
<result column="url" property="url" />
<result column="sort" property="sort" />
<result column="levels" property="levels" />
<result column="menu_flag" property="menuFlag" />
<result column="description" property="description" />
<result column="status" property="status" />
<result column="new_page_flag" property="newPageFlag" />
<result column="open_flag" property="openFlag" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
<result column="create_user" property="createUser" />
<result column="update_user" property="updateUser" />
<id column="menu_id" property="menuId"/>
<result column="code" property="code"/>
<result column="pcode" property="pcode"/>
<result column="pcodes" property="pcodes"/>
<result column="name" property="name"/>
<result column="icon" property="icon"/>
<result column="url" property="url"/>
<result column="sort" property="sort"/>
<result column="levels" property="levels"/>
<result column="menu_flag" property="menuFlag"/>
<result column="description" property="description"/>
<result column="status" property="status"/>
<result column="new_page_flag" property="newPageFlag"/>
<result column="open_flag" property="openFlag"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="create_user" property="createUser"/>
<result column="update_user" property="updateUser"/>
</resultMap>
<!-- 通用查询结果列 -->
......@@ -251,6 +251,7 @@
m1.url as url,
m1.levels as levels,
m1.menu_flag as ismenu,
m1.system_type as systemType,
m1.sort as num
FROM
sys_menu m1
......@@ -321,4 +322,14 @@
</if>
</select>
<select id="getMenusTypesByRoleIds" resultType="java.lang.String">
select DISTINCT system_type from
sys_relation rel
inner join sys_menu m on rel.menu_id = m.menu_id
where rel.role_id in
<foreach collection="list" index="index" item="i" open="(" separator="," close=")">
#{i}
</foreach>
</select>
</mapper>
......@@ -65,5 +65,9 @@ public class MenuDto implements Serializable {
* 备注
*/
private String description;
/**
* 系统分类(字典)
*/
private String systemType;
}
......@@ -6,6 +6,7 @@ import cn.stylefeng.guns.base.pojo.page.LayuiPageFactory;
import cn.stylefeng.guns.base.pojo.page.LayuiPageInfo;
import cn.stylefeng.guns.sys.core.exception.enums.BizExceptionEnum;
import cn.stylefeng.guns.sys.modular.system.entity.Dict;
import cn.stylefeng.guns.sys.modular.system.entity.DictType;
import cn.stylefeng.guns.sys.modular.system.mapper.DictMapper;
import cn.stylefeng.guns.sys.modular.system.model.params.DictParam;
import cn.stylefeng.guns.sys.modular.system.model.result.DictResult;
......@@ -15,11 +16,13 @@ import cn.stylefeng.roses.kernel.model.exception.ServiceException;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -32,6 +35,9 @@ import java.util.List;
@Service
public class DictService extends ServiceImpl<DictMapper, Dict> {
@Autowired
private DictTypeService dictTypeService;
/**
* 新增
*
......@@ -247,6 +253,35 @@ public class DictService extends ServiceImpl<DictMapper, Dict> {
}
/**
* 查询字典列表,通过字典类型code
*
* @author fengshuonan
* @Date 2019-06-20 15:14
*/
public List<Dict> listDictsByCode(String dictTypeCode) {
QueryWrapper<DictType> wrapper = new QueryWrapper<>();
wrapper.eq("code", dictTypeCode);
DictType one = this.dictTypeService.getOne(wrapper);
return listDicts(one.getDictTypeId());
}
/**
* 查询字典列表,通过字典类型code
*
* @author fengshuonan
* @Date 2019-06-20 15:14
*/
public List<Map<String, Object>> getDictsByCodes(List<String> dictCodes) {
QueryWrapper<Dict> wrapper = new QueryWrapper<>();
wrapper.in("code", dictCodes).orderByAsc("sort");
return this.listMaps(wrapper);
}
private Serializable getKey(DictParam param) {
return param.getDictId();
}
......@@ -294,4 +329,5 @@ public class DictService extends ServiceImpl<DictMapper, Dict> {
}
}
}
}
......@@ -49,7 +49,7 @@ public class MenuService extends ServiceImpl<MenuMapper, Menu> {
@Transactional
public void addMenu(MenuDto menuDto) {
if (ToolUtil.isOneEmpty(menuDto, menuDto.getCode(), menuDto.getName(), menuDto.getPid(), menuDto.getMenuFlag(), menuDto.getUrl())) {
if (ToolUtil.isOneEmpty(menuDto, menuDto.getCode(), menuDto.getName(), menuDto.getPid(), menuDto.getMenuFlag(), menuDto.getUrl(), menuDto.getSystemType())) {
throw new RequestEmptyException();
}
......@@ -128,6 +128,9 @@ public class MenuService extends ServiceImpl<MenuMapper, Menu> {
int level = StrUtil.count(menuPcodes, "[");
menu.setLevels(level);
//更新systemType
menu.setSystemType(newMenu.getSystemType());
this.updateById(menu);
}
......
......@@ -198,12 +198,39 @@ public class UserService extends ServiceImpl<UserMapper, User> {
* @author fengshuonan
* @Date 2018/12/24 22:46
*/
public List<MenuNode> getUserMenuNodes(List<Long> roleList) {
public List<Map<String, Object>> getUserMenuNodes(List<Long> roleList) {
if (roleList == null || roleList.size() == 0) {
return new ArrayList<>();
} else {
List<MenuNode> menus = menuService.getMenusByRoleIds(roleList);
return MenuNode.buildTitle(menus);
//定义不同系统分类的菜单集合
ArrayList<Map<String, Object>> lists = new ArrayList<>();
//根据当前用户包含的系统类型,分类出不同的菜单
List<Map<String, Object>> systemTypes = ShiroKit.getUserNotNull().getSystemTypes();
for (Map<String, Object> systemType : systemTypes) {
//当前遍历系统分类code
String systemCode = (String) systemType.get("code");
//获取当前系统分类下菜单集合
ArrayList<MenuNode> originSystemTypeMenus = new ArrayList<>();
for (MenuNode menu : menus) {
if (menu.getSystemType().equals(systemCode)) {
originSystemTypeMenus.add(menu);
}
}
//拼接存放key为系统分类编码,value为该分类下菜单集合的map
HashMap<String, Object> map = new HashMap<>();
List<MenuNode> treeSystemTypeMenus = MenuNode.buildTitle(originSystemTypeMenus);
map.put("systemType", systemCode);
map.put("menus", treeSystemTypeMenus);
lists.add(map);
}
return lists;
}
}
......
......@@ -64,10 +64,27 @@ layui.use(['layer', 'form', 'admin', 'laydate', 'ax', 'iconPicker'], function ()
type: 'fontClass',
search: true,
page: true,
limit: 48,
limit: 12,
click: function (data) {
}
});
iconPicker.checkIcon('iconPicker', 'layui-icon-star-fill');
//初始化字典详细列表
$("#dictDetails").html('');
var ajax = new $ax(Feng.ctxPath + "/dict/listDictsByCode", function (data) {
for (var i = 0; i < data.data.length; i++) {
var name = data.data[i].name;
var code = data.data[i].code;
$("#dictDetails").append('<input type="radio" name="systemType" value="' + code + '" title="' + name + '">');
}
form.render();
}, function (data) {
});
ajax.set("dictTypeCode", "SYSTEM_TYPE");
ajax.start();
});
\ No newline at end of file
......@@ -17,6 +17,19 @@ layui.use(['layer', 'form', 'admin', 'laydate', 'ax', 'iconPicker'], function ()
var layer = layui.layer;
var iconPicker = layui.iconPicker;
//初始化字典详细列表
$("#dictDetails").html('');
var ajax = new $ax(Feng.ctxPath + "/dict/listDictsByCode", function (data) {
for (var i = 0; i < data.data.length; i++) {
var name = data.data[i].name;
var code = data.data[i].code;
$("#dictDetails").append('<input type="radio" name="systemType" value="' + code + '" title="' + name + '">');
}
}, function (data) {
});
ajax.set("dictTypeCode", "SYSTEM_TYPE");
ajax.start();
//获取菜单信息
var ajax = new $ax(Feng.ctxPath + "/menu/getMenuInfo?menuId=" + Feng.getUrlParam("menuId"));
var result = ajax.start();
......
......@@ -12,6 +12,18 @@
<li class="layui-nav-item" lay-unselect>
<a ew-event="refresh" title="刷新"><i class="layui-icon layui-icon-refresh-3"></i></a>
</li>
@var types = shiro.getUser().systemTypes;
@if(tool.isNotEmpty(types)){
@for(type in types) {
@if(typeLP.index == 1){
<li class="layui-nav-item layui-hide-xs layui-this" lay-unselect><a nav-bind="${type.code}">${type.name}</a></li>
@}else{
<li class="layui-nav-item layui-hide-xs" lay-unselect><a nav-bind="${type.code}">${type.name}</a></li>
@}
@}
@}
@if(constants.getDefaultAdvert()){
<li class="layui-nav-item" lay-unselect>
<a href="https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=p4kqz45e" target="_blank">阿里云5折优惠券,点我领取</a>
......@@ -23,6 +35,7 @@
<a style="color: #fe7300;" href="https://gitee.com/stylefeng/guns" target="_blank">请star支持一下Guns</a>
</li>
@}
</ul>
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item" lay-unselect>
......
@/* 侧边栏 */
<div class="layui-side">
<div class="layui-side-scroll">
<ul class="layui-nav layui-nav-tree" lay-filter="admin-side-nav" style="margin-top: 15px;">
@for(menu in menus) {
@for(item in menus){
<ul class="layui-nav layui-nav-tree" nav-id="${item.systemType}" lay-filter="admin-side-nav" style="margin-top: 15px;">
@for(menu in item.menus) {
@if(tool.isEmpty(menu.children)){
<li class="layui-nav-item">
<a lay-href="${menu.url}"><i class="layui-icon ${menu.icon}"></i>&emsp;<cite>${menu.name}</cite></a>
......@@ -41,5 +43,7 @@
@}
@}
</ul>
@}
</div>
</div>
\ No newline at end of file
......@@ -41,6 +41,12 @@
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系统分类<span style="color: red;">*</span></label>
<div class="layui-input-block" id="dictDetails">
<input type="radio" name="systemType" value="" title="无" disabled="disabled">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
<input name="sort" placeholder="请输入排序" type="text" class="layui-input"/>
......
......@@ -41,6 +41,12 @@
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">系统分类<span style="color: red;">*</span></label>
<div class="layui-input-block" id="dictDetails">
<input type="radio" name="systemType" value="" title="无" disabled="disabled">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
<input name="sort" placeholder="请输入排序" type="text" class="layui-input"/>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment