/** * BladeX Commercial License Agreement * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. *

* Use of this software is governed by the Commercial License Agreement * obtained after purchasing a license from BladeX. *

* 1. This software is for development use only under a valid license * from BladeX. *

* 2. Redistribution of this software's source code to any third party * without a commercial license is strictly prohibited. *

* 3. Licensees may copyright their own code but cannot use segments * from this software for such purposes. Copyright of this software * remains with BladeX. *

* Using this software signifies agreement to this License, and the software * must not be used for illegal purposes. *

* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is * not liable for any claims arising from secondary or illegal development. *

* Author: Chill Zhuang (bladejava@qq.com) */ package org.springblade.modules.system.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springblade.common.cache.SysCache; import org.springblade.common.cache.UserCache; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.cache.utils.CacheUtil; import org.springblade.core.launch.constant.AppConstant; import org.springblade.core.mp.support.Condition; import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.secure.constant.AuthConstant; import org.springblade.core.tenant.annotation.NonDS; import org.springblade.core.tool.api.R; import org.springblade.core.tool.constant.BladeConstant; import org.springblade.core.tool.constant.RoleConstant; import org.springblade.core.tool.utils.Func; import org.springblade.modules.system.pojo.entity.Role; import org.springblade.modules.system.pojo.entity.User; import org.springblade.modules.system.service.IRoleService; import org.springblade.modules.system.pojo.vo.GrantVO; import org.springblade.modules.system.pojo.vo.RoleVO; import org.springblade.modules.system.wrapper.RoleWrapper; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.List; import java.util.Map; import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE; /** * 控制器 * * @author Chill */ @NonDS @RestController @AllArgsConstructor @RequestMapping(AppConstant.APPLICATION_SYSTEM_NAME + "/role") @Tag(name = "角色", description = "角色") @PreAuth(RoleConstant.HAS_ROLE_ADMIN) public class RoleController extends BladeController { private final IRoleService roleService; /** * 详情 */ @GetMapping("/detail") @ApiOperationSupport(order = 1) @Operation(summary = "详情", description = "传入role") public R detail(Role role) { Role detail = roleService.getOne(Condition.getQueryWrapper(role)); return R.data(RoleWrapper.build().entityVO(detail)); } /** * 列表 */ @GetMapping("/list") @Parameters({ @Parameter(name = "roleName", description = "参数名称", in = ParameterIn.QUERY, schema = @Schema(type = "string")), @Parameter(name = "roleAlias", description = "角色别名", in = ParameterIn.QUERY, schema = @Schema(type = "string")) }) @ApiOperationSupport(order = 2) @Operation(summary = "列表", description = "传入role") public R> list(@Parameter(hidden = true) @RequestParam Map role, BladeUser bladeUser) { QueryWrapper queryWrapper = Condition.getQueryWrapper(role, Role.class); List list = roleService.list((!bladeUser.getTenantId().equals(BladeConstant.ADMIN_TENANT_ID)) ? queryWrapper.lambda().eq(Role::getTenantId, bladeUser.getTenantId()) : queryWrapper); return R.data(RoleWrapper.build().listNodeVO(list)); } /** * 获取角色树形结构 */ @GetMapping("/tree") @ApiOperationSupport(order = 3) @Operation(summary = "树形结构", description = "树形结构") public R> tree(String tenantId, BladeUser bladeUser) { List tree = roleService.tree(Func.toStrWithEmpty(tenantId, bladeUser.getTenantId())); return R.data(tree); } /** * 获取指定角色树形结构 */ @GetMapping("/tree-by-id") @ApiOperationSupport(order = 4) @Operation(summary = "树形结构", description = "树形结构") public R> treeById(Long roleId, BladeUser bladeUser) { Role role = SysCache.getRole(roleId); List tree = roleService.tree(Func.notNull(role) ? role.getTenantId() : bladeUser.getTenantId()); return R.data(tree); } /** * 新增或修改 */ @PostMapping("/submit") @ApiOperationSupport(order = 5) @Operation(summary = "新增或修改", description = "传入role") public R submit(@Valid @RequestBody Role role) { CacheUtil.clear(SYS_CACHE); CacheUtil.clear(SYS_CACHE, Boolean.FALSE); return R.status(roleService.submit(role)); } /** * 删除 */ @PostMapping("/remove") @ApiOperationSupport(order = 6) @Operation(summary = "删除", description = "传入ids") public R remove(@Parameter(name = "主键集合", required = true) @RequestParam String ids) { CacheUtil.clear(SYS_CACHE); CacheUtil.clear(SYS_CACHE, Boolean.FALSE); return R.status(roleService.removeRole(ids)); } /** * 设置角色权限 */ @PostMapping("/grant") @ApiOperationSupport(order = 7) @Operation(summary = "权限设置", description = "传入roleId集合以及menuId集合") public R grant(@RequestBody GrantVO grantVO) { CacheUtil.clear(SYS_CACHE); CacheUtil.clear(SYS_CACHE, Boolean.FALSE); List roleIds = grantVO.getRoleIds(); if(roleIds!=null && Func.isNull(roleIds.get(0))){ Role role = new Role(); role.setParentId(0L); role.setRoleName(grantVO.getRoleName()); roleService.submit(role); roleIds = new ArrayList<>(); roleIds.add(role.getId()); } boolean temp = roleService.grant(roleIds, grantVO.getMenuIds(), grantVO.getDataScopeIds(), grantVO.getApiScopeIds()); return R.status(temp); } /** * 下拉数据源 */ @PreAuth(AuthConstant.PERMIT_ALL) @GetMapping("/select") @ApiOperationSupport(order = 8) @Operation(summary = "下拉数据源", description = "传入id集合") public R> select(Long userId, String roleId) { if (Func.isNotEmpty(userId)) { User user = UserCache.getUser(userId); roleId = user.getRoleId(); } List list = roleService.list(Wrappers.lambdaQuery().in(Role::getId, Func.toLongList(roleId))); return R.data(list); } }