增加角色功能接口
This commit is contained in:
parent
99687f9b45
commit
14a7477d55
@ -0,0 +1,22 @@
|
|||||||
|
package com.qqchen.deploy.backend.api;
|
||||||
|
|
||||||
|
import com.qqchen.deploy.backend.entity.Role;
|
||||||
|
import com.qqchen.deploy.backend.framework.controller.BaseController;
|
||||||
|
import com.qqchen.deploy.backend.model.RoleDTO;
|
||||||
|
import com.qqchen.deploy.backend.model.query.RoleQuery;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Tag(name = "角色管理")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/role")
|
||||||
|
public class RoleApiController extends BaseController<Role, RoleDTO, Long, RoleQuery> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void exportData(jakarta.servlet.http.HttpServletResponse response, List<RoleDTO> data) {
|
||||||
|
// TODO: 实现导出功能
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -66,11 +66,6 @@ public class Menu extends Entity<Long> {
|
|||||||
*/
|
*/
|
||||||
private Boolean hidden;
|
private Boolean hidden;
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否启用(true:启用 false:禁用)
|
|
||||||
*/
|
|
||||||
private Boolean enabled;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 菜单关联的角色列表
|
* 菜单关联的角色列表
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -3,84 +3,43 @@ package com.qqchen.deploy.backend.entity;
|
|||||||
import com.qqchen.deploy.backend.framework.annotation.LogicDelete;
|
import com.qqchen.deploy.backend.framework.annotation.LogicDelete;
|
||||||
import com.qqchen.deploy.backend.framework.domain.Entity;
|
import com.qqchen.deploy.backend.framework.domain.Entity;
|
||||||
import jakarta.persistence.Column;
|
import jakarta.persistence.Column;
|
||||||
import jakarta.persistence.FetchType;
|
|
||||||
import jakarta.persistence.JoinColumn;
|
|
||||||
import jakarta.persistence.JoinTable;
|
|
||||||
import jakarta.persistence.ManyToMany;
|
|
||||||
import jakarta.persistence.Table;
|
import jakarta.persistence.Table;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
import jakarta.persistence.ManyToMany;
|
||||||
|
import jakarta.persistence.JoinTable;
|
||||||
|
import jakarta.persistence.JoinColumn;
|
||||||
|
import jakarta.persistence.FetchType;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 角色实体
|
|
||||||
*/
|
|
||||||
@Data
|
@Data
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@jakarta.persistence.Entity
|
@jakarta.persistence.Entity
|
||||||
@Table(name = "sys_role")
|
@Table(name = "sys_role")
|
||||||
@LogicDelete
|
@LogicDelete
|
||||||
public class Role extends Entity<Long> {
|
public class Role extends Entity<Long> {
|
||||||
|
|
||||||
/**
|
@Column(unique = true, nullable = false, length = 50)
|
||||||
* 角色编码
|
|
||||||
*/
|
|
||||||
@NotBlank(message = "角色编码不能为空")
|
|
||||||
@Column(nullable = false, length = 100, unique = true)
|
|
||||||
private String code;
|
private String code;
|
||||||
|
|
||||||
/**
|
@Column(nullable = false, length = 50)
|
||||||
* 角色名称
|
|
||||||
*/
|
|
||||||
@NotBlank(message = "角色名称不能为空")
|
|
||||||
@Column(nullable = false, length = 100)
|
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
/**
|
@Column(length = 200)
|
||||||
* 角色类型(1:系统角色 2:自定义角色)
|
|
||||||
*/
|
|
||||||
@Column(nullable = false)
|
|
||||||
private Integer type;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 角色描述
|
|
||||||
*/
|
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
/**
|
|
||||||
* 显示顺序
|
|
||||||
*/
|
|
||||||
@Column(nullable = false)
|
@Column(nullable = false)
|
||||||
private Integer sort = 0;
|
private Integer sort;
|
||||||
|
|
||||||
/**
|
@ManyToMany
|
||||||
* 是否启用
|
|
||||||
*/
|
|
||||||
private Boolean enabled;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 角色关联的用户列表
|
|
||||||
*/
|
|
||||||
@ManyToMany(mappedBy = "roles")
|
|
||||||
private Set<User> users = new HashSet<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 角色关联的菜单列表
|
|
||||||
*/
|
|
||||||
@ManyToMany(fetch = FetchType.LAZY)
|
|
||||||
@JoinTable(
|
@JoinTable(
|
||||||
name = "sys_role_menu",
|
name = "sys_role_menu",
|
||||||
joinColumns = @JoinColumn(name = "role_id"),
|
joinColumns = @JoinColumn(name = "role_id"),
|
||||||
inverseJoinColumns = @JoinColumn(name = "menu_id")
|
inverseJoinColumns = @JoinColumn(name = "menu_id")
|
||||||
)
|
)
|
||||||
private Set<Menu> menus = new HashSet<>();
|
private Set<Menu> menus = new HashSet<>();
|
||||||
|
|
||||||
/**
|
|
||||||
* 角色关联的标签列表
|
|
||||||
*/
|
|
||||||
@ManyToMany(fetch = FetchType.LAZY)
|
@ManyToMany(fetch = FetchType.LAZY)
|
||||||
@JoinTable(
|
@JoinTable(
|
||||||
name = "sys_role_tag_relation",
|
name = "sys_role_tag_relation",
|
||||||
@ -88,5 +47,4 @@ public class Role extends Entity<Long> {
|
|||||||
inverseJoinColumns = @JoinColumn(name = "tag_id")
|
inverseJoinColumns = @JoinColumn(name = "tag_id")
|
||||||
)
|
)
|
||||||
private Set<RoleTag> tags = new HashSet<>();
|
private Set<RoleTag> tags = new HashSet<>();
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -52,11 +52,6 @@ public class MenuDTO extends BaseDTO {
|
|||||||
*/
|
*/
|
||||||
private Boolean hidden;
|
private Boolean hidden;
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否启用(true:启用 false:禁用)
|
|
||||||
*/
|
|
||||||
private Boolean enabled;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 子菜单列表
|
* 子菜单列表
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -14,9 +14,6 @@ public class RoleDTO extends BaseDTO {
|
|||||||
|
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
private Integer type;
|
|
||||||
|
|
||||||
private Integer sort;
|
private Integer sort;
|
||||||
|
|
||||||
private Boolean enabled;
|
}
|
||||||
}
|
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
package com.qqchen.deploy.backend.model.query;
|
||||||
|
|
||||||
|
import com.qqchen.deploy.backend.framework.query.BaseQuery;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
public class RoleQuery extends BaseQuery {
|
||||||
|
|
||||||
|
private String code;
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
}
|
||||||
@ -53,9 +53,5 @@ public class MenuRequest {
|
|||||||
* 是否隐藏(true:隐藏 false:显示)
|
* 是否隐藏(true:隐藏 false:显示)
|
||||||
*/
|
*/
|
||||||
private Boolean hidden;
|
private Boolean hidden;
|
||||||
|
|
||||||
/**
|
}
|
||||||
* 是否启用(true:启用 false:禁用<EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
*/
|
|
||||||
private Boolean enabled;
|
|
||||||
}
|
|
||||||
@ -1,11 +1,8 @@
|
|||||||
package com.qqchen.deploy.backend.service;
|
package com.qqchen.deploy.backend.service;
|
||||||
|
|
||||||
import com.qqchen.deploy.backend.entity.User;
|
|
||||||
import com.qqchen.deploy.backend.framework.service.IBaseService;
|
import com.qqchen.deploy.backend.framework.service.IBaseService;
|
||||||
import com.qqchen.deploy.backend.entity.Menu;
|
import com.qqchen.deploy.backend.entity.Menu;
|
||||||
import com.qqchen.deploy.backend.model.MenuDTO;
|
import com.qqchen.deploy.backend.model.MenuDTO;
|
||||||
import com.qqchen.deploy.backend.model.UserDTO;
|
|
||||||
import com.qqchen.deploy.backend.model.request.MenuRequest;
|
|
||||||
import com.qqchen.deploy.backend.model.response.MenuResponse;
|
import com.qqchen.deploy.backend.model.response.MenuResponse;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|||||||
@ -10,20 +10,16 @@ public interface IRoleService extends IBaseService<Role, RoleDTO, Long> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证角色编码是否存在
|
* 验证角色编码是否存在
|
||||||
* @param code 角色编码
|
|
||||||
*/
|
*/
|
||||||
void validateCode(String code);
|
void validateCode(String code);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证角色名称是否存在
|
* 验证角色名称是否存在
|
||||||
* @param name 角色名称
|
|
||||||
*/
|
*/
|
||||||
void validateName(String name);
|
void validateName(String name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取用户的所有角色ID
|
* 获取用户的所有角色ID
|
||||||
* @param userId 用户ID
|
|
||||||
* @return 角色ID列表
|
|
||||||
*/
|
*/
|
||||||
List<Long> getUserRoleIds(Long userId);
|
List<Long> getUserRoleIds(Long userId);
|
||||||
}
|
}
|
||||||
@ -2,15 +2,10 @@ package com.qqchen.deploy.backend.service.impl;
|
|||||||
|
|
||||||
import com.qqchen.deploy.backend.converter.MenuConverter;
|
import com.qqchen.deploy.backend.converter.MenuConverter;
|
||||||
import com.qqchen.deploy.backend.entity.Menu;
|
import com.qqchen.deploy.backend.entity.Menu;
|
||||||
import com.qqchen.deploy.backend.entity.User;
|
|
||||||
import com.qqchen.deploy.backend.framework.annotation.ServiceType;
|
import com.qqchen.deploy.backend.framework.annotation.ServiceType;
|
||||||
import com.qqchen.deploy.backend.framework.enums.ResponseCode;
|
|
||||||
import com.qqchen.deploy.backend.framework.exception.BusinessException;
|
|
||||||
import com.qqchen.deploy.backend.framework.security.SecurityUtils;
|
|
||||||
import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl;
|
import com.qqchen.deploy.backend.framework.service.impl.BaseServiceImpl;
|
||||||
import com.qqchen.deploy.backend.model.MenuDTO;
|
import com.qqchen.deploy.backend.model.MenuDTO;
|
||||||
import com.qqchen.deploy.backend.model.UserDTO;
|
import com.qqchen.deploy.backend.model.UserDTO;
|
||||||
import com.qqchen.deploy.backend.model.response.LoginResponse;
|
|
||||||
import com.qqchen.deploy.backend.model.response.MenuResponse;
|
import com.qqchen.deploy.backend.model.response.MenuResponse;
|
||||||
import com.qqchen.deploy.backend.repository.IMenuRepository;
|
import com.qqchen.deploy.backend.repository.IMenuRepository;
|
||||||
import com.qqchen.deploy.backend.service.IMenuService;
|
import com.qqchen.deploy.backend.service.IMenuService;
|
||||||
@ -33,10 +28,10 @@ import static com.qqchen.deploy.backend.framework.annotation.ServiceType.Type.DA
|
|||||||
public class MenuServiceImpl extends BaseServiceImpl<Menu, MenuDTO, Long> implements IMenuService {
|
public class MenuServiceImpl extends BaseServiceImpl<Menu, MenuDTO, Long> implements IMenuService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private IMenuRepository repository;
|
private IMenuRepository menuRepository;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private MenuConverter converter;
|
private MenuConverter menuConverter;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private IUserService userService;
|
private IUserService userService;
|
||||||
@ -46,10 +41,10 @@ public class MenuServiceImpl extends BaseServiceImpl<Menu, MenuDTO, Long> implem
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<MenuResponse> getMenuTree() {
|
public List<MenuResponse> getMenuTree() {
|
||||||
List<Menu> allMenus = repository.findByDeletedFalseOrderBySort();
|
List<Menu> allMenus = menuRepository.findByDeletedFalseOrderBySort();
|
||||||
List<MenuDTO> menuDTOs = converter.toDtoList(allMenus);
|
List<MenuDTO> menuDTOs = menuConverter.toDtoList(allMenus);
|
||||||
List<MenuDTO> menuTree = buildMenuTree(menuDTOs);
|
List<MenuDTO> menuTree = buildMenuTree(menuDTOs);
|
||||||
return converter.toResponseList(menuTree);
|
return menuConverter.toResponseList(menuTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -61,14 +56,14 @@ public class MenuServiceImpl extends BaseServiceImpl<Menu, MenuDTO, Long> implem
|
|||||||
List<Long> roleIds = roleService.getUserRoleIds(user.getId());
|
List<Long> roleIds = roleService.getUserRoleIds(user.getId());
|
||||||
|
|
||||||
// 3. 获取这些角色关联的所有菜单
|
// 3. 获取这些角色关联的所有菜单
|
||||||
List<Menu> userMenus = repository.findByRoleIdsAndEnabledTrue(roleIds);
|
List<Menu> userMenus = menuRepository.findByRoleIdsAndEnabledTrue(roleIds);
|
||||||
|
|
||||||
// 4. 转换为DTO并构建树形结构
|
// 4. 转换为DTO并构建树形结构
|
||||||
List<MenuDTO> menuDTOs = converter.toDtoList(userMenus);
|
List<MenuDTO> menuDTOs = menuConverter.toDtoList(userMenus);
|
||||||
List<MenuDTO> menuTree = buildMenuTree(menuDTOs);
|
List<MenuDTO> menuTree = buildMenuTree(menuDTOs);
|
||||||
|
|
||||||
// 5. 转换为响应对象
|
// 5. 转换为响应对象
|
||||||
return converter.toResponseList(menuTree);
|
return menuConverter.toResponseList(menuTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<MenuDTO> buildMenuTree(List<MenuDTO> menus) {
|
private List<MenuDTO> buildMenuTree(List<MenuDTO> menus) {
|
||||||
|
|||||||
@ -23,23 +23,23 @@ import static com.qqchen.deploy.backend.framework.annotation.ServiceType.Type.DA
|
|||||||
public class RoleServiceImpl extends BaseServiceImpl<Role, RoleDTO, Long> implements IRoleService {
|
public class RoleServiceImpl extends BaseServiceImpl<Role, RoleDTO, Long> implements IRoleService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private IRoleRepository repository;
|
private IRoleRepository roleRepository;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Long> getUserRoleIds(Long userId) {
|
public List<Long> getUserRoleIds(Long userId) {
|
||||||
return repository.findRoleIdsByUserId(userId);
|
return roleRepository.findRoleIdsByUserId(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void validateCode(String code) {
|
public void validateCode(String code) {
|
||||||
if (repository.existsByCodeAndDeletedFalse(code)) {
|
if (roleRepository.existsByCodeAndDeletedFalse(code)) {
|
||||||
throw new BusinessException(ResponseCode.ROLE_CODE_EXISTS);
|
throw new BusinessException(ResponseCode.ROLE_CODE_EXISTS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void validateName(String name) {
|
public void validateName(String name) {
|
||||||
if (repository.existsByNameAndDeletedFalse(name)) {
|
if (roleRepository.existsByNameAndDeletedFalse(name)) {
|
||||||
throw new BusinessException(ResponseCode.ROLE_NAME_EXISTS);
|
throw new BusinessException(ResponseCode.ROLE_NAME_EXISTS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -47,12 +47,12 @@ public class RoleServiceImpl extends BaseServiceImpl<Role, RoleDTO, Long> implem
|
|||||||
@Override
|
@Override
|
||||||
protected void validateUniqueConstraints(RoleDTO dto) {
|
protected void validateUniqueConstraints(RoleDTO dto) {
|
||||||
// 检查角色编码唯一性
|
// 检查角色编码唯一性
|
||||||
if (repository.existsByCodeAndDeletedFalse(dto.getCode())) {
|
if (roleRepository.existsByCodeAndDeletedFalse(dto.getCode())) {
|
||||||
throw new UniqueConstraintException(ResponseCode.ROLE_CODE_EXISTS, "code", dto.getCode());
|
throw new UniqueConstraintException(ResponseCode.ROLE_CODE_EXISTS, "code", dto.getCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查角色名称唯一性
|
// 检查角色名称唯一性
|
||||||
if (repository.existsByNameAndDeletedFalse(dto.getName())) {
|
if (roleRepository.existsByNameAndDeletedFalse(dto.getName())) {
|
||||||
throw new UniqueConstraintException(ResponseCode.ROLE_NAME_EXISTS, "name", dto.getName());
|
throw new UniqueConstraintException(ResponseCode.ROLE_NAME_EXISTS, "name", dto.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user