15 changed files with 396 additions and 4 deletions
-
40src/main/java/com/example/demo/controller/MenuController.java
-
41src/main/java/com/example/demo/controller/RoleController.java
-
2src/main/java/com/example/demo/domain/entity/Menu.java
-
1src/main/java/com/example/demo/domain/entity/Role.java
-
30src/main/java/com/example/demo/domain/vo/MenuVo.java
-
35src/main/java/com/example/demo/domain/vo/RoleVo.java
-
21src/main/java/com/example/demo/mapper/MenuMapper.java
-
24src/main/java/com/example/demo/mapper/RoleMapper.java
-
20src/main/java/com/example/demo/service/MenuService.java
-
20src/main/java/com/example/demo/service/RoleService.java
-
58src/main/java/com/example/demo/serviceImpl/MenuServiceImpl.java
-
66src/main/java/com/example/demo/serviceImpl/RoleServiceImpl.java
-
6src/main/resources/application.yml
-
23src/main/resources/mapper/MenuMapper.xml
-
13src/main/resources/mapper/RoleMapper.xml
@ -0,0 +1,40 @@ |
|||
package com.example.demo.controller; |
|||
|
|||
import com.example.demo.domain.vo.MenuVo; |
|||
import com.example.demo.domain.vo.Result; |
|||
import com.example.demo.domain.vo.RoleVo; |
|||
import com.example.demo.service.MenuService; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Controller; |
|||
import org.springframework.web.bind.annotation.*; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName MenuController |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 14:10 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
@RestController |
|||
@RequestMapping("/menu") |
|||
@RequiredArgsConstructor |
|||
@Slf4j |
|||
@CrossOrigin |
|||
public class MenuController { |
|||
|
|||
@Autowired |
|||
private MenuService menuService; |
|||
|
|||
//获取权限树 |
|||
@PostMapping("/tree") |
|||
public Result getPermissionTree(@RequestBody RoleVo roleVo) { |
|||
List<MenuVo> permissionTree = menuService.getPermissionTree(roleVo.getId()); |
|||
return Result.success(permissionTree); |
|||
} |
|||
} |
@ -0,0 +1,41 @@ |
|||
package com.example.demo.controller; |
|||
|
|||
import com.example.demo.domain.entity.Role; |
|||
import com.example.demo.domain.vo.Page; |
|||
import com.example.demo.domain.vo.Result; |
|||
import com.example.demo.domain.vo.RoleVo; |
|||
import com.example.demo.service.RefundService; |
|||
import com.example.demo.service.RoleService; |
|||
import lombok.RequiredArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.util.ObjectUtils; |
|||
import org.springframework.web.bind.annotation.*; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName RoleController |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 11:23 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
@RestController |
|||
@RequestMapping("/role") |
|||
@RequiredArgsConstructor |
|||
@Slf4j |
|||
@CrossOrigin |
|||
public class RoleController { |
|||
|
|||
@Autowired |
|||
private RoleService roleService; |
|||
|
|||
//新增角色 |
|||
@PostMapping("/add") |
|||
public Result addRole(@RequestBody RoleVo roleVo) { |
|||
|
|||
return roleService.addRole(roleVo); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,30 @@ |
|||
package com.example.demo.domain.vo; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName MenuVo |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 13:16 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
@Data |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class MenuVo { |
|||
|
|||
private Integer id;//id |
|||
private String menuName;//菜单名 |
|||
private Integer parentId;//父id |
|||
private Integer priority;//优先级 |
|||
private Integer menuType;//类型 |
|||
// 子菜单列表(用于构建树形结构) |
|||
private List<MenuVo> children; |
|||
} |
@ -0,0 +1,35 @@ |
|||
package com.example.demo.domain.vo; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonFormat; |
|||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.Date; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName RoleVo |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 11:45 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
@Data |
|||
@NoArgsConstructor |
|||
public class RoleVo implements Serializable { |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
private Integer id; // 角色id |
|||
private String roleName; // 角色名 |
|||
private String roleKey; // 角色标识符 |
|||
private Integer priority;//优先级 |
|||
private String fatherId;//上级角色id |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") |
|||
private Date createTime; // 创建时间 |
|||
|
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai") |
|||
private Date updateTime; // 更新时间 |
|||
} |
@ -0,0 +1,21 @@ |
|||
package com.example.demo.mapper; |
|||
|
|||
|
|||
import com.example.demo.domain.vo.MenuVo; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName MenuMapper |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 13:28 |
|||
* @Version 1.0 |
|||
**/ |
|||
@Mapper |
|||
public interface MenuMapper { |
|||
|
|||
//根据角色ID查菜单权限 |
|||
List<MenuVo> selectMenusByRoleId(Integer roleId); |
|||
} |
@ -0,0 +1,24 @@ |
|||
package com.example.demo.mapper; |
|||
|
|||
|
|||
import com.example.demo.domain.entity.Role; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
|
|||
import java.util.Random; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName RoleMaper |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 11:33 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
|
|||
@Mapper |
|||
public interface RoleMapper { |
|||
|
|||
//查找角色名 |
|||
Role selectByRoleName(String roleName); |
|||
} |
@ -0,0 +1,20 @@ |
|||
package com.example.demo.service; |
|||
|
|||
import java.util.List; |
|||
import com.example.demo.domain.vo.MenuVo; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName MenuService |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 13:38 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
public interface MenuService { |
|||
|
|||
|
|||
//根据角色ID生成权限树 |
|||
List<MenuVo> getPermissionTree(Integer roleId); |
|||
} |
@ -0,0 +1,20 @@ |
|||
package com.example.demo.service; |
|||
|
|||
|
|||
import com.example.demo.domain.vo.Result; |
|||
import com.example.demo.domain.vo.RoleVo; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName RoleService |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 11:29 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
public interface RoleService { |
|||
|
|||
//新增角色 |
|||
Result addRole(RoleVo roleVo); |
|||
} |
@ -0,0 +1,58 @@ |
|||
package com.example.demo.serviceImpl; |
|||
|
|||
import com.example.demo.domain.vo.MenuVo; |
|||
import com.example.demo.mapper.MenuMapper; |
|||
import com.example.demo.service.MenuService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.util.List; |
|||
import java.util.Objects; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName MenuServiceImpl |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 13:38 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
@Service |
|||
public class MenuServiceImpl implements MenuService { |
|||
|
|||
@Autowired |
|||
private MenuMapper menuMapper; |
|||
|
|||
//构建菜单树 |
|||
@Override |
|||
public List<MenuVo> getPermissionTree(Integer roleId) { |
|||
// 1. 查询该管理员的所有权限菜单(平级列表) |
|||
List<MenuVo> allMenus = menuMapper.selectMenusByRoleId(roleId); |
|||
|
|||
// 2. 构建树形结构(根节点parentId=1) |
|||
return buildTree(allMenus, 1); |
|||
} |
|||
|
|||
/** |
|||
* 递归构建树形结构 |
|||
* @param allMenus 所有菜单列表 |
|||
* @param parentId 父菜单ID(初始为0,查根节点) |
|||
*/ |
|||
//详细递归构建树过程 |
|||
private List<MenuVo> buildTree(List<MenuVo> allMenus, Integer parentId) { |
|||
// 过滤出当前父节点的子菜单 |
|||
List<MenuVo> children = allMenus.stream() |
|||
.filter(menu -> Objects.equals(menu.getParentId(), parentId)) |
|||
.collect(Collectors.toList()); |
|||
|
|||
// 递归为每个子菜单设置子节点 |
|||
for (MenuVo child : children) { |
|||
child.setChildren(buildTree(allMenus, child.getId())); |
|||
} |
|||
|
|||
return children; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,66 @@ |
|||
package com.example.demo.serviceImpl; |
|||
|
|||
import com.example.demo.domain.vo.Result; |
|||
import com.example.demo.domain.vo.RoleVo; |
|||
import com.example.demo.mapper.RefundMapper; |
|||
import com.example.demo.mapper.RoleMapper; |
|||
import com.example.demo.service.RoleService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
/** |
|||
* @program: gold-java |
|||
* @ClassName RoleServiceImpl |
|||
* @description: |
|||
* @author: Double |
|||
* @create: 2025−07-15 11:30 |
|||
* @Version 1.0 |
|||
**/ |
|||
|
|||
@Service |
|||
public class RoleServiceImpl implements RoleService { |
|||
|
|||
@Autowired |
|||
private RoleMapper roleMapper; |
|||
|
|||
//新增角色 |
|||
@Override |
|||
public Result addRole(RoleVo roleVo) { |
|||
//校验角色名 |
|||
if(roleVo.getRoleName()==null|| roleVo.getRoleName().isEmpty()){ |
|||
return Result.error("角色名为空"); |
|||
} |
|||
if(roleMapper.selectByRoleName(roleVo.getRoleName())!=null){ |
|||
return Result.error("角色名重复"); |
|||
} |
|||
if(roleVo.getPriority()==null){ |
|||
return Result.error("优先级为空"); |
|||
} |
|||
return Result.success("创建成功"); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
@ -0,0 +1,23 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="com.example.demo.mapper.MenuMapper"> |
|||
|
|||
<select id="selectMenusByRoleId" resultType="com.example.demo.domain.vo.MenuVo"> |
|||
SELECT DISTINCT |
|||
m.id, |
|||
m.menu_name, |
|||
m.parent_id, |
|||
m.menu_type, |
|||
m.priority |
|||
FROM |
|||
role r |
|||
LEFT JOIN role_menu rm ON r.id = rm.role_id |
|||
LEFT JOIN menu m ON rm.menu_id = m.id |
|||
WHERE |
|||
r.id = #{roleId} |
|||
AND m.id IS NOT NULL |
|||
ORDER BY |
|||
m.parent_id,m.priority |
|||
</select> |
|||
|
|||
</mapper> |
@ -0,0 +1,13 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
<mapper namespace="com.example.demo.mapper.RoleMapper"> |
|||
|
|||
|
|||
<select id="selectByRoleName" resultType="com.example.demo.domain.entity.Role"> |
|||
SELECT id FROM role |
|||
<where> |
|||
role_name = #{roleName} |
|||
</where> |
|||
</select> |
|||
|
|||
</mapper> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue