增加角色功能接口

This commit is contained in:
戚辰先生 2024-12-01 00:03:59 +08:00
parent 99687f9b45
commit 14a7477d55
11 changed files with 68 additions and 103 deletions

View File

@ -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: 实现导出功能
}
}

View File

@ -66,11 +66,6 @@ public class Menu extends Entity<Long> {
*/
private Boolean hidden;
/**
* 是否启用true启用 false禁用
*/
private Boolean enabled;
/**
* 菜单关联的角色列表
*/

View File

@ -3,84 +3,43 @@ package com.qqchen.deploy.backend.entity;
import com.qqchen.deploy.backend.framework.annotation.LogicDelete;
import com.qqchen.deploy.backend.framework.domain.Entity;
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.validation.constraints.NotBlank;
import lombok.Data;
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.Set;
/**
* 角色实体
*/
@Data
@EqualsAndHashCode(callSuper = true)
@jakarta.persistence.Entity
@Table(name = "sys_role")
@LogicDelete
public class Role extends Entity<Long> {
/**
* 角色编码
*/
@NotBlank(message = "角色编码不能为空")
@Column(nullable = false, length = 100, unique = true)
@Column(unique = true, nullable = false, length = 50)
private String code;
/**
* 角色名称
*/
@NotBlank(message = "角色名称不能为空")
@Column(nullable = false, length = 100)
@Column(nullable = false, length = 50)
private String name;
/**
* 角色类型1系统角色 2自定义角色
*/
@Column(nullable = false)
private Integer type;
/**
* 角色描述
*/
@Column(length = 200)
private String description;
/**
* 显示顺序
*/
@Column(nullable = false)
private Integer sort = 0;
/**
* 是否启用
*/
private Boolean enabled;
/**
* 角色关联的用户列表
*/
@ManyToMany(mappedBy = "roles")
private Set<User> users = new HashSet<>();
/**
* 角色关联的菜单列表
*/
@ManyToMany(fetch = FetchType.LAZY)
private Integer sort;
@ManyToMany
@JoinTable(
name = "sys_role_menu",
joinColumns = @JoinColumn(name = "role_id"),
inverseJoinColumns = @JoinColumn(name = "menu_id")
)
private Set<Menu> menus = new HashSet<>();
/**
* 角色关联的标签列表
*/
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "sys_role_tag_relation",
@ -88,5 +47,4 @@ public class Role extends Entity<Long> {
inverseJoinColumns = @JoinColumn(name = "tag_id")
)
private Set<RoleTag> tags = new HashSet<>();
}

View File

@ -52,11 +52,6 @@ public class MenuDTO extends BaseDTO {
*/
private Boolean hidden;
/**
* 是否启用true启用 false禁用
*/
private Boolean enabled;
/**
* 子菜单列表
*/

View File

@ -14,9 +14,6 @@ public class RoleDTO extends BaseDTO {
private String description;
private Integer type;
private Integer sort;
private Boolean enabled;
}
}

View File

@ -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;
}

View File

@ -53,9 +53,5 @@ public class MenuRequest {
* 是否隐藏true隐藏 false显示
*/
private Boolean hidden;
/**
* 是否启用true启用 false禁用<EFBFBD><EFBFBD><EFBFBD>
*/
private Boolean enabled;
}
}

View File

@ -1,11 +1,8 @@
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.entity.Menu;
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 java.util.List;

View File

@ -10,20 +10,16 @@ public interface IRoleService extends IBaseService<Role, RoleDTO, Long> {
/**
* 验证角色编码是否存在
* @param code 角色编码
*/
void validateCode(String code);
/**
* 验证角色名称是否存在
* @param name 角色名称
*/
void validateName(String name);
/**
* 获取用户的所有角色ID
* @param userId 用户ID
* @return 角色ID列表
*/
List<Long> getUserRoleIds(Long userId);
}

View File

@ -2,15 +2,10 @@ package com.qqchen.deploy.backend.service.impl;
import com.qqchen.deploy.backend.converter.MenuConverter;
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.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.model.MenuDTO;
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.repository.IMenuRepository;
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 {
@Resource
private IMenuRepository repository;
private IMenuRepository menuRepository;
@Resource
private MenuConverter converter;
private MenuConverter menuConverter;
@Resource
private IUserService userService;
@ -46,10 +41,10 @@ public class MenuServiceImpl extends BaseServiceImpl<Menu, MenuDTO, Long> implem
@Override
public List<MenuResponse> getMenuTree() {
List<Menu> allMenus = repository.findByDeletedFalseOrderBySort();
List<MenuDTO> menuDTOs = converter.toDtoList(allMenus);
List<Menu> allMenus = menuRepository.findByDeletedFalseOrderBySort();
List<MenuDTO> menuDTOs = menuConverter.toDtoList(allMenus);
List<MenuDTO> menuTree = buildMenuTree(menuDTOs);
return converter.toResponseList(menuTree);
return menuConverter.toResponseList(menuTree);
}
@Override
@ -61,14 +56,14 @@ public class MenuServiceImpl extends BaseServiceImpl<Menu, MenuDTO, Long> implem
List<Long> roleIds = roleService.getUserRoleIds(user.getId());
// 3. 获取这些角色关联的所有菜单
List<Menu> userMenus = repository.findByRoleIdsAndEnabledTrue(roleIds);
List<Menu> userMenus = menuRepository.findByRoleIdsAndEnabledTrue(roleIds);
// 4. 转换为DTO并构建树形结构
List<MenuDTO> menuDTOs = converter.toDtoList(userMenus);
List<MenuDTO> menuDTOs = menuConverter.toDtoList(userMenus);
List<MenuDTO> menuTree = buildMenuTree(menuDTOs);
// 5. 转换为响应对象
return converter.toResponseList(menuTree);
return menuConverter.toResponseList(menuTree);
}
private List<MenuDTO> buildMenuTree(List<MenuDTO> menus) {

View File

@ -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 {
@Resource
private IRoleRepository repository;
private IRoleRepository roleRepository;
@Override
public List<Long> getUserRoleIds(Long userId) {
return repository.findRoleIdsByUserId(userId);
return roleRepository.findRoleIdsByUserId(userId);
}
@Override
public void validateCode(String code) {
if (repository.existsByCodeAndDeletedFalse(code)) {
if (roleRepository.existsByCodeAndDeletedFalse(code)) {
throw new BusinessException(ResponseCode.ROLE_CODE_EXISTS);
}
}
@Override
public void validateName(String name) {
if (repository.existsByNameAndDeletedFalse(name)) {
if (roleRepository.existsByNameAndDeletedFalse(name)) {
throw new BusinessException(ResponseCode.ROLE_NAME_EXISTS);
}
}
@ -47,12 +47,12 @@ public class RoleServiceImpl extends BaseServiceImpl<Role, RoleDTO, Long> implem
@Override
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());
}
// 检查角色名称唯一性
if (repository.existsByNameAndDeletedFalse(dto.getName())) {
if (roleRepository.existsByNameAndDeletedFalse(dto.getName())) {
throw new UniqueConstraintException(ResponseCode.ROLE_NAME_EXISTS, "name", dto.getName());
}
}