diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java index c9b31c37..d1031b8c 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java @@ -30,8 +30,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.StrUtil; +import top.charles7c.cnadmin.common.annotation.CrudRequestMapping; import top.charles7c.cnadmin.common.model.query.PageQuery; import top.charles7c.cnadmin.common.model.query.SortQuery; import top.charles7c.cnadmin.common.model.vo.PageDataVO; @@ -72,6 +75,7 @@ public abstract class BaseController, V, D, Q, @ResponseBody @GetMapping protected R> page(@Validated Q query, @Validated PageQuery pageQuery) { + this.checkPermission("list"); PageDataVO pageDataVO = baseService.page(query, pageQuery); return R.ok(pageDataVO); } @@ -89,6 +93,7 @@ public abstract class BaseController, V, D, Q, @ResponseBody @GetMapping("/tree") protected R>> tree(@Validated Q query, @Validated SortQuery sortQuery) { + this.checkPermission("list"); List> list = baseService.tree(query, sortQuery, false); return R.ok(list); } @@ -106,6 +111,7 @@ public abstract class BaseController, V, D, Q, @ResponseBody @GetMapping("/list") protected R> list(@Validated Q query, @Validated SortQuery sortQuery) { + this.checkPermission("list"); List list = baseService.list(query, sortQuery); return R.ok(list); } @@ -122,6 +128,7 @@ public abstract class BaseController, V, D, Q, @ResponseBody @GetMapping("/{id}") protected R get(@PathVariable Long id) { + this.checkPermission("list"); D detail = baseService.get(id); return R.ok(detail); } @@ -137,6 +144,7 @@ public abstract class BaseController, V, D, Q, @ResponseBody @PostMapping protected R add(@Validated(BaseRequest.Add.class) @RequestBody C request) { + this.checkPermission("add"); Long id = baseService.add(request); return R.ok("新增成功", id); } @@ -152,6 +160,7 @@ public abstract class BaseController, V, D, Q, @ResponseBody @PutMapping protected R update(@Validated(BaseRequest.Update.class) @RequestBody C request) { + this.checkPermission("update"); baseService.update(request); return R.ok("修改成功"); } @@ -168,6 +177,7 @@ public abstract class BaseController, V, D, Q, @ResponseBody @DeleteMapping("/{ids}") protected R delete(@PathVariable List ids) { + this.checkPermission("delete"); baseService.delete(ids); return R.ok("删除成功"); } @@ -185,6 +195,20 @@ public abstract class BaseController, V, D, Q, @Operation(summary = "导出数据") @GetMapping("/export") protected void export(@Validated Q query, @Validated SortQuery sortQuery, HttpServletResponse response) { + this.checkPermission("export"); baseService.export(query, sortQuery, response); } + + /** + * 权限认证 + * + * @param subPermission + * 部分权限码 + */ + private void checkPermission(String subPermission) { + CrudRequestMapping crudRequestMapping = this.getClass().getDeclaredAnnotation(CrudRequestMapping.class); + String path = crudRequestMapping.value(); + String permissionPrefix = String.join(":", StrUtil.splitTrim(path, "/")); + StpUtil.checkPermission(String.format("%s:%s", permissionPrefix, subPermission)); + } } diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseServiceImpl.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseServiceImpl.java index 4df6c64c..9aea0c1a 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseServiceImpl.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseServiceImpl.java @@ -41,6 +41,7 @@ import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper; import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Opt; @@ -165,7 +166,10 @@ public abstract class BaseServiceImpl, T, V, D, Q, C ext @Override @Transactional(rollbackFor = Exception.class) public void update(C request) { - T entity = BeanUtil.copyProperties(request, entityClass); + String idName = this.currentEntityIdName(); + Object idValue = ReflectUtil.getFieldValue(request, idName); + T entity = this.getById(idValue); + BeanUtil.copyProperties(request, entity, CopyOptions.create().ignoreNullValue()); baseMapper.updateById(entity); } @@ -211,8 +215,8 @@ public abstract class BaseServiceImpl, T, V, D, Q, C ext * ID * @return 实体信息 */ - protected T getById(Long id) { - T entity = baseMapper.selectById(id); + protected T getById(Object id) { + T entity = baseMapper.selectById(Convert.toStr(id)); CheckUtils.throwIfNull(entity, String.format("ID为 [%s] 的记录已不存在", id)); return entity; } diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/consts/Constants.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/consts/Constants.java index e848cbec..0979d5d1 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/consts/Constants.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/consts/Constants.java @@ -31,7 +31,12 @@ public class Constants { /** * 超级管理员角色编码 */ - public static final String ADMIN_ROLE_CODE = "admin"; + public static final String SUPER_ADMIN = "admin"; + + /** + * 全部权限标识 + */ + public static final String ALL_PERMISSION = "*"; /** * 默认密码 diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/handler/GlobalExceptionHandler.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/handler/GlobalExceptionHandler.java index b7da3af1..5a06a332 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/handler/GlobalExceptionHandler.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/handler/GlobalExceptionHandler.java @@ -36,6 +36,8 @@ import org.springframework.web.method.annotation.MethodArgumentTypeMismatchExcep import org.springframework.web.multipart.MaxUploadSizeExceededException; import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.exception.NotPermissionException; +import cn.dev33.satoken.exception.NotRoleException; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; @@ -163,7 +165,20 @@ public class GlobalExceptionHandler { } /** - * 拦截认证异常-未登录异常 + * 拦截文件上传异常-超过上传大小限制 + */ + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MaxUploadSizeExceededException.class) + public R handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e, HttpServletRequest request) { + log.error("请求地址'{}',上传文件失败,文件大小超过限制", request.getRequestURI(), e); + String sizeLimit = StrUtil.subBetween(e.getMessage(), "The maximum size ", " for"); + String errorMsg = String.format("请上传小于 %s MB 的文件", NumberUtil.parseLong(sizeLimit) / 1024 / 1024); + LogContextHolder.setErrorMsg(errorMsg); + return R.fail(HttpStatus.BAD_REQUEST.value(), errorMsg); + } + + /** + * 认证异常-登录认证 */ @ResponseStatus(HttpStatus.UNAUTHORIZED) @ExceptionHandler(NotLoginException.class) @@ -188,15 +203,22 @@ public class GlobalExceptionHandler { } /** - * 拦截文件上传异常-超过上传大小限制 + * 认证异常-权限认证 */ - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(MaxUploadSizeExceededException.class) - public R handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e, HttpServletRequest request) { - log.error("请求地址'{}',上传文件失败,文件大小超过限制", request.getRequestURI(), e); - String sizeLimit = StrUtil.subBetween(e.getMessage(), "The maximum size ", " for"); - String errorMsg = String.format("请上传小于 %s MB 的文件", NumberUtil.parseLong(sizeLimit) / 1024 / 1024); - LogContextHolder.setErrorMsg(errorMsg); - return R.fail(HttpStatus.BAD_REQUEST.value(), errorMsg); + @ResponseStatus(HttpStatus.FORBIDDEN) + @ExceptionHandler(NotPermissionException.class) + public R handleNotPermissionException(NotPermissionException e, HttpServletRequest request) { + log.error("请求地址'{}',权限码校验失败'{}'", request.getRequestURI(), e); + return R.fail(HttpStatus.FORBIDDEN.value(), "没有访问权限,请联系管理员授权"); + } + + /** + * 认证异常-角色认证 + */ + @ResponseStatus(HttpStatus.FORBIDDEN) + @ExceptionHandler(NotRoleException.class) + public R handleNotRoleException(NotRoleException e, HttpServletRequest request) { + log.error("请求地址'{}',角色权限校验失败'{}'", request.getRequestURI(), e); + return R.fail(HttpStatus.FORBIDDEN.value(), "没有访问权限,请联系管理员授权"); } } \ No newline at end of file diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/model/dto/LoginUser.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/model/dto/LoginUser.java index 7952bb28..fad70902 100644 --- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/model/dto/LoginUser.java +++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/model/dto/LoginUser.java @@ -18,6 +18,7 @@ package top.charles7c.cnadmin.common.model.dto; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.Set; import lombok.Data; @@ -118,4 +119,14 @@ public class LoginUser implements Serializable { * 登录时间 */ private LocalDateTime loginTime; + + /** + * 权限码集合 + */ + private Set permissions; + + /** + * 角色编码集合 + */ + private Set roles; } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenConfiguration.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenConfiguration.java index 601cdda9..37e496bb 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenConfiguration.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenConfiguration.java @@ -24,8 +24,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.interceptor.SaInterceptor; import cn.dev33.satoken.jwt.StpLogicJwtForSimple; +import cn.dev33.satoken.stp.StpInterface; import cn.dev33.satoken.stp.StpLogic; import cn.dev33.satoken.stp.StpUtil; @@ -53,7 +55,23 @@ public class SaTokenConfiguration implements WebMvcConfigurer { * Sa-Token 整合 JWT(简单模式) */ @Bean - public StpLogic getStpLogicJwt() { + public StpLogic stpLogic() { return new StpLogicJwtForSimple(); } + + /** + * Sa-Token 持久层本地 Redis 适配 + */ + @Bean + public SaTokenDao saTokenDao() { + return new SaTokenRedisDaoImpl(); + } + + /** + * Sa-Token 权限认证适配 + */ + @Bean + public StpInterface stpInterface() { + return new SaTokenPermissionImpl(); + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenPermissionImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenPermissionImpl.java new file mode 100644 index 00000000..f159a57e --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenPermissionImpl.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.cnadmin.auth.config.satoken; + +import java.util.ArrayList; +import java.util.List; + +import cn.dev33.satoken.stp.StpInterface; + +import top.charles7c.cnadmin.common.model.dto.LoginUser; +import top.charles7c.cnadmin.common.util.helper.LoginHelper; + +/** + * Sa-Token 权限认证适配 + * + * @author Charles7c + * @since 2023/3/1 22:28 + */ +public class SaTokenPermissionImpl implements StpInterface { + + @Override + public List getPermissionList(Object loginId, String loginType) { + LoginUser loginUser = LoginHelper.getLoginUser(); + return new ArrayList<>(loginUser.getPermissions()); + } + + @Override + public List getRoleList(Object loginId, String loginType) { + LoginUser loginUser = LoginHelper.getLoginUser(); + return new ArrayList<>(loginUser.getRoles()); + } +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenRedisDaoImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenRedisDaoImpl.java index 50f55743..1ce608a2 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenRedisDaoImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/config/satoken/SaTokenRedisDaoImpl.java @@ -21,20 +21,17 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.springframework.stereotype.Component; - import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.util.SaFoxUtil; import top.charles7c.cnadmin.common.util.RedisUtils; /** - * SaTokenDao 的本地 Redis 适配(参考:Sa-Token/sa-token-plugin/sa-token-dao-redisx/SaTokenDaoOfRedis.java) + * Sa-Token 持久层本地 Redis 适配(参考:Sa-Token/sa-token-plugin/sa-token-dao-redisx/SaTokenDaoOfRedis.java) * * @author Charles7c * @since 2022/12/28 22:55 */ -@Component public class SaTokenRedisDaoImpl implements SaTokenDao { @Override diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/vo/UserInfoVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/vo/UserInfoVO.java index ce1f745f..936455f5 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/vo/UserInfoVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/vo/UserInfoVO.java @@ -19,6 +19,7 @@ package top.charles7c.cnadmin.auth.model.vo; import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Set; import lombok.Data; import lombok.experimental.Accessors; @@ -123,9 +124,16 @@ public class UserInfoVO implements Serializable { private String deptName; /** - * 用户角色(临时 mock 用,写完角色体系后移除) + * 权限码集合 */ - private String role = "admin"; + @Schema(description = "权限码集合") + private Set permissions; + + /** + * 角色编码集合 + */ + @Schema(description = "角色编码集合") + private Set roles; public String getPhone() { return DesensitizedUtil.mobilePhone(phone); diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/PermissionService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/PermissionService.java new file mode 100644 index 00000000..5d57840f --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/PermissionService.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.cnadmin.auth.service; + +import java.util.Set; + +/** + * 权限业务接口 + * + * @author Charles7c + * @since 2023/3/2 20:40 + */ +public interface PermissionService { + + /** + * 根据用户 ID 查询权限码 + * + * @param userId + * 用户 ID + * @return 权限码集合 + */ + Set listPermissionsByUserId(Long userId); + + /** + * 根据用户 ID 查询角色编码 + * + * @param userId + * 用户 ID + * @return 角色编码集合 + */ + Set listRoleCodesByUserId(Long userId); +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java index adbd6922..6d154cc8 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java @@ -24,6 +24,7 @@ import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import top.charles7c.cnadmin.auth.service.LoginService; +import top.charles7c.cnadmin.auth.service.PermissionService; import top.charles7c.cnadmin.common.enums.DisEnableStatusEnum; import top.charles7c.cnadmin.common.model.dto.LoginUser; import top.charles7c.cnadmin.common.util.ExceptionUtils; @@ -46,6 +47,7 @@ public class LoginServiceImpl implements LoginService { private final UserService userService; private final DeptService deptService; + private final PermissionService permissionService; @Override public String login(String username, String password) { @@ -58,6 +60,8 @@ public class LoginServiceImpl implements LoginService { // 登录 LoginUser loginUser = BeanUtil.copyProperties(userDO, LoginUser.class); loginUser.setDeptName(ExceptionUtils.exToNull(() -> deptService.get(loginUser.getDeptId()).getDeptName())); + loginUser.setPermissions(permissionService.listPermissionsByUserId(userId)); + loginUser.setRoles(permissionService.listRoleCodesByUserId(userId)); LoginHelper.login(loginUser); // 返回令牌 diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/PermissionServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/PermissionServiceImpl.java new file mode 100644 index 00000000..c9949e2d --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/PermissionServiceImpl.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.cnadmin.auth.service.impl; + +import java.util.Set; + +import lombok.RequiredArgsConstructor; + +import org.springframework.stereotype.Service; + +import cn.hutool.core.collection.CollUtil; + +import top.charles7c.cnadmin.auth.service.PermissionService; +import top.charles7c.cnadmin.common.consts.Constants; +import top.charles7c.cnadmin.system.service.MenuService; +import top.charles7c.cnadmin.system.service.RoleService; + +/** + * 权限业务实现类 + * + * @author Charles7c + * @since 2023/3/2 20:40 + */ +@Service +@RequiredArgsConstructor +public class PermissionServiceImpl implements PermissionService { + + private final MenuService menuService; + private final RoleService roleService; + + @Override + public Set listPermissionsByUserId(Long userId) { + Set roleCodeSet = this.listRoleCodesByUserId(userId); + // 超级管理员赋予全部权限 + if (roleCodeSet.contains(Constants.SUPER_ADMIN)) { + return CollUtil.newHashSet(Constants.ALL_PERMISSION); + } + return menuService.listPermissionsByUserId(userId); + } + + @Override + public Set listRoleCodesByUserId(Long userId) { + return roleService.listRoleCodesByUserId(userId); + } +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/MenuMapper.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/MenuMapper.java index 5a361cc4..409ba1cb 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/MenuMapper.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/MenuMapper.java @@ -16,6 +16,10 @@ package top.charles7c.cnadmin.system.mapper; +import java.util.Set; + +import org.apache.ibatis.annotations.Param; + import top.charles7c.cnadmin.common.base.BaseMapper; import top.charles7c.cnadmin.system.model.entity.MenuDO; @@ -25,4 +29,14 @@ import top.charles7c.cnadmin.system.model.entity.MenuDO; * @author Charles7c * @since 2023/2/15 20:30 */ -public interface MenuMapper extends BaseMapper {} +public interface MenuMapper extends BaseMapper { + + /** + * 根据 ID 查询权限码 + * + * @param userId + * 用户 ID + * @return 权限码集合 + */ + Set selectPermissionsByUserId(@Param("userId") Long userId); +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/RoleMenuMapper.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/RoleMenuMapper.java index f00bc8c1..b2c9e037 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/RoleMenuMapper.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/RoleMenuMapper.java @@ -18,9 +18,6 @@ package top.charles7c.cnadmin.system.mapper; import java.util.List; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - import top.charles7c.cnadmin.common.base.BaseMapper; import top.charles7c.cnadmin.system.model.entity.RoleMenuDO; @@ -33,12 +30,11 @@ import top.charles7c.cnadmin.system.model.entity.RoleMenuDO; public interface RoleMenuMapper extends BaseMapper { /** - * 根据角色 ID 查询 + * 根据角色 ID 列表查询 * - * @param roleId - * 角色 ID + * @param roleIds + * 角色 ID 列表 * @return 菜单 ID 列表 */ - @Select("SELECT `menu_id` FROM `sys_role_menu` WHERE `role_id` = #{roleId}") - List selectMenuIdsByRoleId(@Param("roleId") Long roleId); + List selectMenuIdsByRoleIds(List roleIds); } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserRoleMapper.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserRoleMapper.java index 0cc09ed1..153a1174 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserRoleMapper.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserRoleMapper.java @@ -16,6 +16,11 @@ package top.charles7c.cnadmin.system.mapper; +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + import top.charles7c.cnadmin.common.base.BaseMapper; import top.charles7c.cnadmin.system.model.entity.UserRoleDO; @@ -25,4 +30,15 @@ import top.charles7c.cnadmin.system.model.entity.UserRoleDO; * @author Charles7c * @since 2023/2/13 23:13 */ -public interface UserRoleMapper extends BaseMapper {} +public interface UserRoleMapper extends BaseMapper { + + /** + * 根据用户 ID 查询 + * + * @param userId + * 用户 ID + * @return 角色 ID 列表 + */ + @Select("SELECT `role_id` FROM `sys_user_role` WHERE `user_id` = #{userId}") + List selectRoleIdsByUserId(@Param("userId") Long userId); +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java index e321246d..e6c41db3 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/request/UserRequest.java @@ -104,13 +104,11 @@ public class UserRequest extends BaseRequest { * 部门 ID */ @Schema(description = "所属部门") - @NotNull(message = "所属部门不能为空") private Long deptId; /** * 角色 ID 列表 */ @Schema(description = "所属角色") - @NotEmpty(message = "所属角色不能为空") private List roleIds; } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java index 5e794a62..e73af562 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/model/vo/RoleVO.java @@ -90,7 +90,7 @@ public class RoleVO extends BaseVO { private Boolean disabled; public Boolean getDisabled() { - if (Constants.ADMIN_ROLE_CODE.equals(roleCode)) { + if (Constants.SUPER_ADMIN.equals(roleCode)) { return true; } return disabled; diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/MenuService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/MenuService.java index b6cd8307..efb70e92 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/MenuService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/MenuService.java @@ -16,6 +16,8 @@ package top.charles7c.cnadmin.system.service; +import java.util.Set; + import top.charles7c.cnadmin.common.base.BaseService; import top.charles7c.cnadmin.system.model.query.MenuQuery; import top.charles7c.cnadmin.system.model.request.MenuRequest; @@ -27,4 +29,14 @@ import top.charles7c.cnadmin.system.model.vo.MenuVO; * @author Charles7c * @since 2023/2/15 20:30 */ -public interface MenuService extends BaseService {} +public interface MenuService extends BaseService { + + /** + * 根据用户 ID 查询 + * + * @param userId + * 用户 ID + * @return 权限码集合 + */ + Set listPermissionsByUserId(Long userId); +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleMenuService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleMenuService.java index 551afe28..b22204d6 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleMenuService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleMenuService.java @@ -39,9 +39,9 @@ public interface RoleMenuService { /** * 根据角色 ID 查询 * - * @param roleId - * 角色 ID + * @param roleIds + * 角色 ID 列表 * @return 菜单 ID 列表 */ - List listMenuIdByRoleId(Long roleId); + List listMenuIdByRoleIds(List roleIds); } \ No newline at end of file diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleService.java index 9dbd0cb0..c12fa94a 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/RoleService.java @@ -17,6 +17,7 @@ package top.charles7c.cnadmin.system.service; import java.util.List; +import java.util.Set; import top.charles7c.cnadmin.common.base.BaseService; import top.charles7c.cnadmin.common.model.vo.LabelValueVO; @@ -50,4 +51,13 @@ public interface RoleService extends BaseService listRoleNamesByRoleIds(List roleIds); + + /** + * 根据用户 ID 查询角色编码 + * + * @param userId + * 用户 ID + * @return 角色编码集合 + */ + Set listRoleCodesByUserId(Long userId); } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/MenuServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/MenuServiceImpl.java index 0f4c2b45..6a4f3cfe 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/MenuServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/MenuServiceImpl.java @@ -16,7 +16,7 @@ package top.charles7c.cnadmin.system.service.impl; -import java.util.List; +import java.util.*; import lombok.RequiredArgsConstructor; @@ -89,4 +89,9 @@ public class MenuServiceImpl extends BaseServiceImpl listPermissionsByUserId(Long userId) { + return baseMapper.selectPermissionsByUserId(userId); + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleMenuServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleMenuServiceImpl.java index c2361aa0..ffdbff35 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleMenuServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleMenuServiceImpl.java @@ -16,6 +16,7 @@ package top.charles7c.cnadmin.system.service.impl; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -57,7 +58,10 @@ public class RoleMenuServiceImpl implements RoleMenuService { } @Override - public List listMenuIdByRoleId(Long roleId) { - return roleMenuMapper.selectMenuIdsByRoleId(roleId); + public List listMenuIdByRoleIds(List roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return Collections.emptyList(); + } + return roleMenuMapper.selectMenuIdsByRoleIds(roleIds); } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java index bb7fd5eb..9d199351 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/RoleServiceImpl.java @@ -18,6 +18,7 @@ package top.charles7c.cnadmin.system.service.impl; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -61,8 +62,11 @@ public class RoleServiceImpl extends BaseServiceImpl isExists, String.format("新增失败,'%s'已存在", roleName)); + CheckUtils.throwIf(() -> this.checkNameExists(roleName, request.getRoleId()), + String.format("新增失败,'%s'已存在", roleName)); + String roleCode = request.getRoleCode(); + CheckUtils.throwIf(() -> this.checkCodeExists(roleCode, request.getRoleId()), + String.format("新增失败,'%s'已存在", roleCode)); // 新增角色 request.setStatus(DisEnableStatusEnum.ENABLE); @@ -78,8 +82,11 @@ public class RoleServiceImpl extends BaseServiceImpl isExists, String.format("修改失败,'%s'已存在", roleName)); + CheckUtils.throwIf(() -> this.checkNameExists(roleName, request.getRoleId()), + String.format("修改失败,'%s'已存在", roleName)); + String roleCode = request.getRoleCode(); + CheckUtils.throwIf(() -> this.checkCodeExists(roleCode, request.getRoleId()), + String.format("修改失败,'%s'已存在", roleCode)); // 更新角色 super.update(request); @@ -110,18 +117,31 @@ public class RoleServiceImpl extends BaseServiceImpl list = menuService.list(null, null); List menuIds = list.stream().map(MenuVO::getMenuId).collect(Collectors.toList()); detailVO.setMenuIds(menuIds); } else { - detailVO.setMenuIds(roleMenuService.listMenuIdByRoleId(roleId)); + detailVO.setMenuIds(roleMenuService.listMenuIdByRoleIds(Collections.singletonList(roleId))); } detailVO.setDeptIds(roleDeptService.listDeptIdByRoleId(roleId)); } @@ -143,4 +163,14 @@ public class RoleServiceImpl extends BaseServiceImpl listRoleCodesByUserId(Long userId) { + List roleIds = userRoleService.listRoleIdsByUserId(userId); + List roleList = super.lambdaQuery().select(RoleDO::getRoleCode).in(RoleDO::getRoleId, roleIds).list(); + if (CollUtil.isEmpty(roleList)) { + return Collections.emptySet(); + } + return roleList.stream().map(RoleDO::getRoleCode).collect(Collectors.toSet()); + } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserRoleServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserRoleServiceImpl.java index 7bbc395d..ac5341c9 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserRoleServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/impl/UserRoleServiceImpl.java @@ -16,7 +16,6 @@ package top.charles7c.cnadmin.system.service.impl; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -64,11 +63,6 @@ public class UserRoleServiceImpl implements UserRoleService { @Override public List listRoleIdsByUserId(Long userId) { - List userRoleList = userRoleMapper.selectList( - Wrappers.lambdaQuery().select(UserRoleDO::getRoleId).eq(UserRoleDO::getUserId, userId)); - if (CollUtil.isEmpty(userRoleList)) { - return Collections.emptyList(); - } - return userRoleList.stream().map(UserRoleDO::getRoleId).collect(Collectors.toList()); + return userRoleMapper.selectRoleIdsByUserId(userId); } } diff --git a/continew-admin-system/src/main/resources/mapper/MenuMapper.xml b/continew-admin-system/src/main/resources/mapper/MenuMapper.xml index 9ad5ba2d..5fda33ac 100644 --- a/continew-admin-system/src/main/resources/mapper/MenuMapper.xml +++ b/continew-admin-system/src/main/resources/mapper/MenuMapper.xml @@ -1,4 +1,16 @@ + \ No newline at end of file diff --git a/continew-admin-system/src/main/resources/mapper/RoleMenuMapper.xml b/continew-admin-system/src/main/resources/mapper/RoleMenuMapper.xml new file mode 100644 index 00000000..907c5006 --- /dev/null +++ b/continew-admin-system/src/main/resources/mapper/RoleMenuMapper.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/continew-admin-ui/src/components/message-box/locale/en-US.ts b/continew-admin-ui/src/components/message-box/locale/en-US.ts index 7bfcdff0..13e5d0c2 100644 --- a/continew-admin-ui/src/components/message-box/locale/en-US.ts +++ b/continew-admin-ui/src/components/message-box/locale/en-US.ts @@ -6,7 +6,6 @@ export default { 'messageBox.allRead': 'All Read', 'messageBox.viewMore': 'View More', 'messageBox.noContent': 'No Content', - 'messageBox.switchRoles': 'Switch Roles', 'messageBox.userCenter': 'User Center', 'messageBox.logout': 'Logout', }; diff --git a/continew-admin-ui/src/components/message-box/locale/zh-CN.ts b/continew-admin-ui/src/components/message-box/locale/zh-CN.ts index cedf8164..5a2a97ed 100644 --- a/continew-admin-ui/src/components/message-box/locale/zh-CN.ts +++ b/continew-admin-ui/src/components/message-box/locale/zh-CN.ts @@ -6,7 +6,6 @@ export default { 'messageBox.allRead': '全部已读', 'messageBox.viewMore': '查看更多', 'messageBox.noContent': '暂无内容', - 'messageBox.switchRoles': '切换角色', 'messageBox.userCenter': '个人中心', 'messageBox.logout': '退出登录', }; diff --git a/continew-admin-ui/src/components/navbar/index.vue b/continew-admin-ui/src/components/navbar/index.vue index 4b788f4a..6d45fb38 100644 --- a/continew-admin-ui/src/components/navbar/index.vue +++ b/continew-admin-ui/src/components/navbar/index.vue @@ -150,14 +150,6 @@ avatar 删除 @@ -132,7 +140,7 @@ 修改 删除 @@ -148,7 +156,7 @@ 修改 删除 @@ -148,7 +155,7 @@ 修改 删除 @@ -186,7 +193,7 @@ >