diff --git a/README.md b/README.md index 1badf61a41ddae8b3528ccbce5432a88f3fff9dc..8aa93e73c3882770f8ba0bf832eb344c76f4a55c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

- + @@ -10,7 +10,7 @@

码匠君 - +

diff --git a/cool-dependencies/pom.xml b/cool-dependencies/pom.xml index f1b2a29b89f87b143d8e342c62adef877bf1d2f8..d4682049bb6e5678181af7a07c45b594a77428ff 100644 --- a/cool-dependencies/pom.xml +++ b/cool-dependencies/pom.xml @@ -21,7 +21,7 @@ 3.2.3 8.3.0 - 1.7.9 + 1.8.0 3.0.3 33.0.0-jre @@ -34,9 +34,9 @@ 1.27.2 3.1.8 3.3.3 - 3.1.0 + 3.1.1 4.6.0 - 15.0.0.Dev07 + 15.0.0.Dev10 2.2.3 2.7.0 diff --git a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/MenuController.java b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/MenuController.java new file mode 100644 index 0000000000000000000000000000000000000000..9d00f23405f65ba98ca9adbed1dee9be44f3630e --- /dev/null +++ b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/MenuController.java @@ -0,0 +1,83 @@ +package com.xgblack.cool.module.system.web; + +import com.xgblack.cool.module.system.api.MenuServiceI; +import com.xgblack.cool.module.system.dto.permission.MenuAddCmd; +import com.xgblack.cool.module.system.dto.permission.MenuEditCmd; +import com.xgblack.cool.module.system.dto.permission.MenuListQry; +import com.xgblack.cool.module.system.dto.permission.clientobject.MenuCO; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 管理后台 - 菜单 + * @author xg black + */ + + +@RestController +@RequestMapping("/system/menu") +@Validated +@RequiredArgsConstructor +public class MenuController { + + private final MenuServiceI menuService; + + /** + * 创建菜单 + * @param cmd + */ + @PostMapping + //@PreAuthorize("@ss.hasPermission('system:menu:add')") + public void add(@Valid @RequestBody MenuAddCmd cmd) { + + } + + /** + * 修改菜单 + * @param cmd + */ + @PutMapping + //@PreAuthorize("@ss.hasPermission('system:menu:edit')") + public void edit(@Valid @RequestBody MenuEditCmd cmd) { + + } + + /** + * 删除菜单 + * @param id + */ + @DeleteMapping("{id}") + //@Parameter(name = "id", description = "菜单编号", required= true, example = "1024") + //@PreAuthorize("@ss.hasPermission('system:menu:remove')") + public void remove(@PathVariable("id") Long id) { + + } + + @GetMapping("list") + //@Operation(summary = "获取菜单列表", description = "用于【菜单管理】界面") + //@PreAuthorize("@ss.hasPermission('system:menu:query')") + public List list(MenuListQry qry) { + return null; + } + + /*@GetMapping({"/list-all-simple", "simple-list"}) + @Operation(summary = "获取菜单精简信息列表", description = "只包含被开启的菜单,用于【角色分配菜单】功能的选项。" + + "在多租户的场景下,会只返回租户所在套餐有的菜单") + public CommonResult> getSimpleMenuList() { + List list = menuService.getMenuListByTenant( + new MenuListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus())); + list.sort(Comparator.comparing(MenuDO::getSort)); + return success(BeanUtils.toBean(list, MenuSimpleRespVO.class)); + }*/ + + @GetMapping("detail/{id}") + //@Operation(summary = "获取菜单信息") + //@PreAuthorize("@ss.hasPermission('system:menu:query')") + public MenuCO detail(@PathVariable Long id) { + return new MenuCO(); + } +} diff --git a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/PermissionController.java b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/PermissionController.java new file mode 100644 index 0000000000000000000000000000000000000000..c805040684e9e4e44dc78e5cd4447eb8f2c71d53 --- /dev/null +++ b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/PermissionController.java @@ -0,0 +1,73 @@ +package com.xgblack.cool.module.system.web; + +import com.xgblack.cool.module.system.api.PermissionServiceI; +import com.xgblack.cool.module.system.dto.permission.PermissionUserRoleAssignCmd; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Set; + +/** + * 管理后台 - 权限 + * @author xg black + */ + +@RestController +@RequestMapping("/system/permission") +@RequiredArgsConstructor +public class PermissionController { + + private final PermissionServiceI permissionService; + + /*@Operation(summary = "获得角色拥有的菜单编号") + @Parameter(name = "roleId", description = "角色编号", required = true) + @GetMapping("/list-role-menus") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") + public CommonResult> getRoleMenuList(Long roleId) { + return success(permissionService.getRoleMenuListByRoleId(roleId)); + }*/ + + /*@PostMapping("/assign-role-menu") + @Operation(summary = "赋予角色菜单") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')") + public CommonResult assignRoleMenu(@Validated @RequestBody PermissionAssignRoleMenuReqVO reqVO) { + // 开启多租户的情况下,需要过滤掉未开通的菜单 + tenantService.handleTenantMenu(menuIds -> reqVO.getMenuIds().removeIf(menuId -> !CollUtil.contains(menuIds, menuId))); + + // 执行菜单的分配 + permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds()); + return success(true); + }*/ + + /*@PostMapping("/assign-role-data-scope") + @Operation(summary = "赋予角色数据权限") + @PreAuthorize("@ss.hasPermission('system:permission:assign-role-data-scope')") + public CommonResult assignRoleDataScope(@Valid @RequestBody PermissionAssignRoleDataScopeReqVO reqVO) { + permissionService.assignRoleDataScope(reqVO.getRoleId(), reqVO.getDataScope(), reqVO.getDataScopeDeptIds()); + return success(true); + }*/ + + /** + * 获得管理员拥有的角色编号列表 + * @param userId + * @return + */ + //@Parameter(name = "userId", description = "用户编号", required = true) + @GetMapping("/list-user-roles") + //@PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')") + public Set listAdminRoles(@RequestParam("userId") Long userId) { + return permissionService.queryUserRoleIdsByUserId(userId); + } + + /** + * 赋予用户角色 + * @param cmd + */ + @PostMapping("/assign-user-role") + //@PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')") + public void assignUserRole(@Validated @RequestBody PermissionUserRoleAssignCmd cmd) { + permissionService.assignUserRole(cmd); + } + +} diff --git a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/RoleController.java b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/RoleController.java index 715fcb43bedbf306277683b8e4236d7e9bd22695..5d0b7ead932bc91895add8b423410a887dd02407 100644 --- a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/RoleController.java +++ b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/RoleController.java @@ -33,17 +33,17 @@ public class RoleController { @PostMapping //@PreAuthorize("@ss.hasPermission('system:role:create')") public void add(@Valid @RequestBody RoleAddCmd cmd) { - + roleService.add(cmd); } /** * 修改角色 * @param cmd */ - @PutMapping("/update") + @PutMapping //@PreAuthorize("@ss.hasPermission('system:role:update')") public void edit(@Valid @RequestBody RoleEditCmd cmd) { - + roleService.edit(cmd); } /** @@ -53,17 +53,17 @@ public class RoleController { @PutMapping("/update-status") //@PreAuthorize("@ss.hasPermission('system:role:update')") public void editStatus(@Valid @RequestBody RoleEditStatusCmd cmd) { - + roleService.editStatus(cmd); } /** * 删除角色 * @param id */ - @DeleteMapping("/delete") + @DeleteMapping("{id}") //@PreAuthorize("@ss.hasPermission('system:role:delete')") - public void remove(@RequestParam("id") Long id) { - + public void remove(@PathVariable("id") Long id) { + roleService.remove(id); } /** @@ -71,10 +71,10 @@ public class RoleController { * @param id * @return */ - @GetMapping("/get") + @GetMapping("detail/{id}") //@PreAuthorize("@ss.hasPermission('system:role:query')") - public RoleCO detail(@RequestParam("id") Long id) { - return null; + public RoleCO detail(@PathVariable Long id) { + return roleService.detail(id); } /** @@ -85,7 +85,7 @@ public class RoleController { @GetMapping("/page") //@PreAuthorize("@ss.hasPermission('system:role:query')") public PageResult getRolePage(RolePageQry qry) { - return null; + return roleService.page(qry); } /*@GetMapping({"/list-all-simple", "/simple-list"}) diff --git a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/UserController.java b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/UserController.java index f4fdcc31596054bd625a86f31899daafd233d049..f48bc5294f3d9a5845fb6f0fbdc9871d6de0ed47 100644 --- a/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/UserController.java +++ b/cool-module-system/cool-module-system-adapter/src/main/java/com/xgblack/cool/module/system/web/UserController.java @@ -32,7 +32,7 @@ public class UserController { @PostMapping //@PreAuthorize("@ss.hasPermission('system:user:create')") public void add(@Validated @RequestBody UserAddCmd cmd) { - userService.save(cmd); + userService.add(cmd); } /** @@ -43,17 +43,17 @@ public class UserController { //@Operation(summary = "修改用户") //@PreAuthorize("@ss.hasPermission('system:user:update')") public void edit(@Validated @RequestBody UserEditCmd cmd) { - userService.update(cmd); + userService.edit(cmd); } /** * 删除用户 * @param id 用户id */ - @DeleteMapping + @DeleteMapping("{id}") //@Operation(summary = "删除用户") //@PreAuthorize("@ss.hasPermission('system:user:delete')") - public void delete(@RequestParam("id") Long id) { + public void delete(@PathVariable Long id) { userService.remove(id); } @@ -117,11 +117,11 @@ public class UserController { * @param id * @return */ - @GetMapping + @GetMapping("detail/{id}") //@Operation(summary = "获得用户详情") //@Parameter(name = "id", description = "编号", required = true, example = "1024") //@PreAuthorize("@ss.hasPermission('system:user:query')") - public UserCO detail(@RequestParam("id") Long id) { + public UserCO detail(@PathVariable("id") Long id) { /*AdminUserDO user = userService.getUser(id); // 拼接数据 DeptDO dept = deptService.getDept(user.getDeptId()); diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/PermissionUserRoleAssignCmdExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/PermissionUserRoleAssignCmdExe.java new file mode 100644 index 0000000000000000000000000000000000000000..936f3d2b969583165a6e5535856fa38668b92e62 --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/PermissionUserRoleAssignCmdExe.java @@ -0,0 +1,42 @@ +package com.xgblack.cool.module.system.executor.permission; + +import com.xgblack.cool.module.system.domain.gateway.PermissionGateway; +import com.xgblack.cool.module.system.dto.permission.PermissionUserRoleAssignCmd; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.hutool.core.collection.CollUtil; +import org.dromara.hutool.core.collection.set.SetUtil; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Set; + +/** + * @author xg black + */ + +@Slf4j +@Component +@RequiredArgsConstructor +public class PermissionUserRoleAssignCmdExe { + + private final PermissionGateway gateway; + + @Transactional(rollbackFor = Exception.class) + public void execute(PermissionUserRoleAssignCmd cmd) { + + // 获得角色拥有角色编号 + Set dbRoleIds = gateway.getRoleIdsByUserId(cmd.getUserId()); + // 用户要修改拥有的角色编号 + Set roleIdList = CollUtil.emptyIfNull(cmd.getRoleIds()); + + // 计算新增和删除的角色编号 + Set createRoleIds = SetUtil.of(CollUtil.subtract(roleIdList, dbRoleIds)); + Set deleteMenuIds = SetUtil.of(CollUtil.subtract(dbRoleIds, roleIdList)); + + // 执行新增和删除。对于已经授权的角色,不用做任何处理 + gateway.insertUserRole(cmd.getUserId(), createRoleIds); + gateway.deleteUserRole(cmd.getUserId(), deleteMenuIds); + + } +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleAddCmdExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleAddCmdExe.java new file mode 100644 index 0000000000000000000000000000000000000000..36f82343d9860a07e69671c056334fa887ba5cbf --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleAddCmdExe.java @@ -0,0 +1,29 @@ +package com.xgblack.cool.module.system.executor.permission; + +import com.xgblack.cool.module.system.convertor.RoleConvertor; +import com.xgblack.cool.module.system.convertor.StudentConvertor; +import com.xgblack.cool.module.system.domain.gateway.RoleGateway; +import com.xgblack.cool.module.system.domain.gateway.StudentGateway; +import com.xgblack.cool.module.system.dto.permission.RoleAddCmd; +import com.xgblack.cool.module.system.dto.student.StudentAddCmd; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author xg black + */ + +@Slf4j +@Component +@RequiredArgsConstructor +public class RoleAddCmdExe { + + private final RoleGateway gateway; + + + public void execute(RoleAddCmd cmd) { + gateway.create(RoleConvertor.INSTANCE.toEntity(cmd)); + } + +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleEditCmdExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleEditCmdExe.java new file mode 100644 index 0000000000000000000000000000000000000000..bb99d8bf7580d64f1b2c00a8c057e55433a2985c --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleEditCmdExe.java @@ -0,0 +1,23 @@ + +package com.xgblack.cool.module.system.executor.permission; + + +import com.xgblack.cool.module.system.convertor.RoleConvertor; +import com.xgblack.cool.module.system.domain.gateway.RoleGateway; +import com.xgblack.cool.module.system.dto.permission.RoleEditCmd; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RoleEditCmdExe { + + private final RoleGateway gateway; + + + public void execute(RoleEditCmd cmd) { + gateway.update(RoleConvertor.INSTANCE.toEntity(cmd)); + } +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleEditStatusExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleEditStatusExe.java new file mode 100644 index 0000000000000000000000000000000000000000..aef7289c816ef46279222b13d6b945e68f7352fb --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleEditStatusExe.java @@ -0,0 +1,22 @@ + +package com.xgblack.cool.module.system.executor.permission; + + +import com.xgblack.cool.module.system.domain.gateway.RoleGateway; +import com.xgblack.cool.module.system.dto.permission.RoleEditStatusCmd; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RoleEditStatusExe { + + private final RoleGateway gateway; + + + public void execute(RoleEditStatusCmd cmd) { + gateway.updateStatus(cmd.getId(), cmd.getStatus()); + } +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleRemoveCmdExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleRemoveCmdExe.java new file mode 100644 index 0000000000000000000000000000000000000000..481c4a46c17cb420ce3eb31a2078f53b39e625a1 --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/RoleRemoveCmdExe.java @@ -0,0 +1,22 @@ + +package com.xgblack.cool.module.system.executor.permission; + + +import com.xgblack.cool.module.system.domain.gateway.RoleGateway; +import com.xgblack.cool.module.system.domain.gateway.StudentGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RoleRemoveCmdExe { + + private final RoleGateway gateway; + + + public void execute(Long id) { + gateway.delete(id); + } +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/query/PermissionRoleIdsByUserIdQryExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/query/PermissionRoleIdsByUserIdQryExe.java new file mode 100644 index 0000000000000000000000000000000000000000..2568b87d516e38ab39ed2c0b8af30407134b73fc --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/query/PermissionRoleIdsByUserIdQryExe.java @@ -0,0 +1,24 @@ +package com.xgblack.cool.module.system.executor.permission.query; + +import com.xgblack.cool.module.system.domain.gateway.PermissionGateway; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Set; + +/** + * @author xg black + */ + +@Slf4j +@Component +@RequiredArgsConstructor +public class PermissionRoleIdsByUserIdQryExe { + + private final PermissionGateway gateway; + + public Set execute(Long userId) { + return gateway.getRoleIdsByUserId(userId); + } +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/query/RoleByIdQryExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/query/RoleByIdQryExe.java new file mode 100644 index 0000000000000000000000000000000000000000..7fee38fe7c85d6066346dea10976cee214a96ab2 --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/query/RoleByIdQryExe.java @@ -0,0 +1,21 @@ +package com.xgblack.cool.module.system.executor.permission.query; + + +import com.xgblack.cool.module.system.convertor.RoleConvertor; +import com.xgblack.cool.module.system.domain.gateway.RoleGateway; +import com.xgblack.cool.module.system.dto.permission.clientobject.RoleCO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RoleByIdQryExe { + + private final RoleGateway gateway; + + public RoleCO execute(Long id) { + return RoleConvertor.INSTANCE.convertEntity2CO(gateway.getById(id)); + } +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/query/RolePageQryExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/query/RolePageQryExe.java new file mode 100644 index 0000000000000000000000000000000000000000..78d5173c942ba8f78c8f47005992e2532b2fe559 --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/permission/query/RolePageQryExe.java @@ -0,0 +1,23 @@ +package com.xgblack.cool.module.system.executor.permission.query; + + +import com.xgblack.cool.framework.common.pojo.dto.PageResult; +import com.xgblack.cool.module.system.convertor.RoleConvertor; +import com.xgblack.cool.module.system.domain.gateway.RoleGateway; +import com.xgblack.cool.module.system.dto.permission.RolePageQry; +import com.xgblack.cool.module.system.dto.permission.clientobject.RoleCO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RolePageQryExe { + + private final RoleGateway gateway; + + public PageResult execute(RolePageQry qry) { + return RoleConvertor.INSTANCE.convertEntity2COPageResult(gateway.getPage(qry)); + } +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserEditLockedCmdExe.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserEditLockedCmdExe.java index 441294536c9a9a55e6f107042b1b5fe1e2ae4589..2f5d281fe441e4311e3e5531d905866209ba7b28 100644 --- a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserEditLockedCmdExe.java +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/executor/user/UserEditLockedCmdExe.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor public class UserEditLockedCmdExe { + private final UserGateway gateway; diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/MenuServiceImpl.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/MenuServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..b2579669d2e16626c1d936cf0dad662dcc05c2e4 --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/MenuServiceImpl.java @@ -0,0 +1,17 @@ +package com.xgblack.cool.module.system.service; + +import com.xgblack.cool.module.system.api.MenuServiceI; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author xg black + */ + +@Slf4j +@Service +@RequiredArgsConstructor +public class MenuServiceImpl implements MenuServiceI { + +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/PermissionServiceImpl.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/PermissionServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..041e9f4f23b12d11f1e7fe6d73f4be3775a1d67b --- /dev/null +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/PermissionServiceImpl.java @@ -0,0 +1,34 @@ +package com.xgblack.cool.module.system.service; + +import com.xgblack.cool.module.system.api.PermissionServiceI; +import com.xgblack.cool.module.system.dto.permission.PermissionUserRoleAssignCmd; +import com.xgblack.cool.module.system.executor.permission.PermissionUserRoleAssignCmdExe; +import com.xgblack.cool.module.system.executor.permission.query.PermissionRoleIdsByUserIdQryExe; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Set; + +/** + * @author xg black + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PermissionServiceImpl implements PermissionServiceI { + + private final PermissionUserRoleAssignCmdExe permissionUserRoleAssignCmdExe; + private final PermissionRoleIdsByUserIdQryExe permissionRoleIdsByUserIdQryExe; + + @Override + public void assignUserRole(PermissionUserRoleAssignCmd cmd) { + permissionUserRoleAssignCmdExe.execute(cmd); + } + + @Override + public Set queryUserRoleIdsByUserId(Long userId) { + return permissionRoleIdsByUserIdQryExe.execute(userId); + } + +} diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/RoleServiceImpl.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/RoleServiceImpl.java index 46e51d47dc0f2c6b1da46c942c43c13c1ae70eab..25caaee41b1334d89ebd1cdef9e5ff5d48c264b5 100644 --- a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/RoleServiceImpl.java +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/RoleServiceImpl.java @@ -1,6 +1,17 @@ package com.xgblack.cool.module.system.service; +import com.xgblack.cool.framework.common.pojo.dto.PageResult; import com.xgblack.cool.module.system.api.RoleServiceI; +import com.xgblack.cool.module.system.dto.permission.RoleAddCmd; +import com.xgblack.cool.module.system.dto.permission.RoleEditCmd; +import com.xgblack.cool.module.system.dto.permission.RoleEditStatusCmd; +import com.xgblack.cool.module.system.dto.permission.RolePageQry; +import com.xgblack.cool.module.system.dto.permission.clientobject.RoleCO; +import com.xgblack.cool.module.system.executor.permission.RoleAddCmdExe; +import com.xgblack.cool.module.system.executor.permission.RoleEditCmdExe; +import com.xgblack.cool.module.system.executor.permission.RoleRemoveCmdExe; +import com.xgblack.cool.module.system.executor.permission.query.RoleByIdQryExe; +import com.xgblack.cool.module.system.executor.permission.query.RolePageQryExe; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -14,6 +25,40 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class RoleServiceImpl implements RoleServiceI { + private final RoleAddCmdExe roleAddCmdExe; + private final RoleByIdQryExe roleByIdQryExe; + private final RoleRemoveCmdExe roleRemoveCmdExe; + private final RoleEditCmdExe roleEditCmdExe; + private final RolePageQryExe rolePageQryExe; + @Override + public void add(RoleAddCmd cmd) { + roleAddCmdExe.execute(cmd); + } + + @Override + public void edit(RoleEditCmd cmd) { + roleEditCmdExe.execute(cmd); + } + + @Override + public void editStatus(RoleEditStatusCmd cmd) { + + } + + @Override + public void remove(Long id) { + roleRemoveCmdExe.execute(id); + } + + @Override + public PageResult page(RolePageQry qry) { + return rolePageQryExe.execute(qry); + } + + @Override + public RoleCO detail(Long id) { + return roleByIdQryExe.execute(id); + } } diff --git a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/UserServiceImpl.java b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/UserServiceImpl.java index e4d35943128ced39f42cbbbf411daff2508d1740..cf11142d35eb601076e23b30a1c8aa95d886bdd6 100644 --- a/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/UserServiceImpl.java +++ b/cool-module-system/cool-module-system-app/src/main/java/com/xgblack/cool/module/system/service/UserServiceImpl.java @@ -31,7 +31,7 @@ public class UserServiceImpl implements UserServiceI { private final UserProfileEditPasswordCmdExe userProfileEditPasswordCmdExe; @Override - public void save(UserAddCmd cmd) { + public void add(UserAddCmd cmd) { userAddCmdExe.execute(cmd); } @@ -46,7 +46,7 @@ public class UserServiceImpl implements UserServiceI { } @Override - public void update(UserEditCmd cmd) { + public void edit(UserEditCmd cmd) { userEditCmdExe.execute(cmd); } diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/MenuServiceI.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/MenuServiceI.java new file mode 100644 index 0000000000000000000000000000000000000000..543692cc9b8b1c6ee00696c6434dcd07805a6c47 --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/MenuServiceI.java @@ -0,0 +1,8 @@ +package com.xgblack.cool.module.system.api; + +/** + * @author xg black + */ + +public interface MenuServiceI { +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/PermissionServiceI.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/PermissionServiceI.java new file mode 100644 index 0000000000000000000000000000000000000000..08718bf7176cf537a011e15c32b649e309499e6d --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/PermissionServiceI.java @@ -0,0 +1,16 @@ +package com.xgblack.cool.module.system.api; + +import com.xgblack.cool.module.system.dto.permission.PermissionUserRoleAssignCmd; + +import java.util.Set; + +/** + * @author xg black + */ + +public interface PermissionServiceI { + + void assignUserRole(PermissionUserRoleAssignCmd cmd); + + Set queryUserRoleIdsByUserId(Long userId); +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/RoleServiceI.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/RoleServiceI.java index 5d3e5f8f6ed756f92899dccbd5e37b87b27769ab..4d9e1da73d843c58d762363401bc5191600763b8 100644 --- a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/RoleServiceI.java +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/RoleServiceI.java @@ -1,5 +1,12 @@ package com.xgblack.cool.module.system.api; +import com.xgblack.cool.framework.common.pojo.dto.PageResult; +import com.xgblack.cool.module.system.dto.permission.RoleAddCmd; +import com.xgblack.cool.module.system.dto.permission.RoleEditCmd; +import com.xgblack.cool.module.system.dto.permission.RoleEditStatusCmd; +import com.xgblack.cool.module.system.dto.permission.RolePageQry; +import com.xgblack.cool.module.system.dto.permission.clientobject.RoleCO; + /** * @author xg black */ @@ -7,5 +14,16 @@ package com.xgblack.cool.module.system.api; public interface RoleServiceI { + void add(RoleAddCmd cmd); + + void edit(RoleEditCmd cmd); + + void editStatus(RoleEditStatusCmd cmd); + + void remove(Long id); + + PageResult page(RolePageQry qry); + + RoleCO detail(Long id); } diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/UserServiceI.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/UserServiceI.java index 690c99f2287db202f5244ba5b65667474b79de2e..710223ac994f4306139c45c6cae422c95456cc71 100644 --- a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/UserServiceI.java +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/api/UserServiceI.java @@ -10,13 +10,13 @@ import com.xgblack.cool.module.system.dto.user.clientobject.UserCO; public interface UserServiceI { - void save(UserAddCmd cmd); + void add(UserAddCmd cmd); UserCO getDetail(Long id); void remove(Long id); - void update(UserEditCmd cmd); + void edit(UserEditCmd cmd); PageResult getPage(UserPageQry qry); diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/MenuAddCmd.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/MenuAddCmd.java new file mode 100644 index 0000000000000000000000000000000000000000..61b0c53c89e7c369e46173c5c859c10dac5c800e --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/MenuAddCmd.java @@ -0,0 +1,69 @@ +package com.xgblack.cool.module.system.dto.permission; + +import com.xgblack.cool.framework.common.pojo.dto.Command; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class MenuAddCmd extends Command { + + /** 菜单名称 */ + @NotBlank(message = "菜单名称不能为空") + @Size(max = 50, message = "菜单名称长度不能超过50个字符") + private String name; + + /** 权限标识,仅菜单类型为按钮时,才需要传递 */ + @Size(max = 100) + private String permission; + + /** 类型,参见 MenuTypeEnum 枚举类 */ + @NotNull(message = "菜单类型不能为空") + private Integer type; + + /** 显示顺序不能为空 */ + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + /** 父菜单 ID */ + @NotNull(message = "父菜单 ID 不能为空") + private Long parentId; + + /** 路由地址,仅菜单类型为菜单或者目录时,才需要传 */ + @Size(max = 200, message = "路由地址不能超过200个字符") + private String path; + + /** 菜单图标,仅菜单类型为菜单或者目录时,才需要传 */ + private String icon; + + /** 组件路径,仅菜单类型为菜单时,才需要传 */ + @Size(max = 200, message = "组件路径不能超过255个字符") + private String component; + + /** 组件名 */ + private String componentName; + + /** 状态 */ + @NotNull(message = "状态不能为空") + private Boolean status; + + /** 是否可见 */ + private Boolean visible; + + /** 是否缓存 */ + private Boolean keepAlive; + + /** 是否总是显示 */ + private Boolean alwaysShow; +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/MenuEditCmd.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/MenuEditCmd.java new file mode 100644 index 0000000000000000000000000000000000000000..bcb6f52436e11f38f09ca8990684476ee679217d --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/MenuEditCmd.java @@ -0,0 +1,73 @@ +package com.xgblack.cool.module.system.dto.permission; + +import com.xgblack.cool.framework.common.pojo.dto.Command; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class MenuEditCmd extends Command { + + /** 菜单编号 */ + @NotNull(message = "菜单编号不能为空") + private Long id; + + /** 菜单名称 */ + @NotBlank(message = "菜单名称不能为空") + @Size(max = 50, message = "菜单名称长度不能超过50个字符") + private String name; + + /** 权限标识,仅菜单类型为按钮时,才需要传递 */ + @Size(max = 100) + private String permission; + + /** 类型,参见 MenuTypeEnum 枚举类 */ + @NotNull(message = "菜单类型不能为空") + private Integer type; + + /** 显示顺序不能为空 */ + @NotNull(message = "显示顺序不能为空") + private Integer sort; + + /** 父菜单 ID */ + @NotNull(message = "父菜单 ID 不能为空") + private Long parentId; + + /** 路由地址,仅菜单类型为菜单或者目录时,才需要传 */ + @Size(max = 200, message = "路由地址不能超过200个字符") + private String path; + + /** 菜单图标,仅菜单类型为菜单或者目录时,才需要传 */ + private String icon; + + /** 组件路径,仅菜单类型为菜单时,才需要传 */ + @Size(max = 200, message = "组件路径不能超过255个字符") + private String component; + + /** 组件名 */ + private String componentName; + + /** 状态 */ + @NotNull(message = "状态不能为空") + private Boolean status; + + /** 是否可见 */ + private Boolean visible; + + /** 是否缓存 */ + private Boolean keepAlive; + + /** 是否总是显示 */ + private Boolean alwaysShow; +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/MenuListQry.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/MenuListQry.java new file mode 100644 index 0000000000000000000000000000000000000000..a871e59d89db6db4647501fb1fb0b92b3d921f3a --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/MenuListQry.java @@ -0,0 +1,29 @@ +package com.xgblack.cool.module.system.dto.permission; + +import com.xgblack.cool.framework.common.pojo.dto.Query; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class MenuListQry extends Query { + + /** + * 菜单名称,模糊匹配 + */ + private String name; + + /** + * 展示状态 + */ + private Boolean status; + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/PermissionUserRoleAssignCmd.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/PermissionUserRoleAssignCmd.java new file mode 100644 index 0000000000000000000000000000000000000000..23403bc7ecc676c72cf6b19339e3d5fdd95c0d7c --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/PermissionUserRoleAssignCmd.java @@ -0,0 +1,34 @@ +package com.xgblack.cool.module.system.dto.permission; + +import com.xgblack.cool.framework.common.pojo.dto.Command; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; +import org.dromara.hutool.core.collection.set.SetUtil; + +import java.util.Set; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class PermissionUserRoleAssignCmd extends Command { + + /** + * 用户编号 + */ + @NotNull(message = "用户编号不能为空") + private Long userId; + + /** + * 角色编号列表 + */ + private Set roleIds = SetUtil.empty(); // 兜底 + +} diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RolePageQry.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RolePageQry.java index 999e0eb603f94ee54e87fc19d79a45a14b566608..f12b642635720346e9d2af99760b92117bdbcd8d 100644 --- a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RolePageQry.java +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/RolePageQry.java @@ -1,5 +1,6 @@ package com.xgblack.cool.module.system.dto.permission; +import com.xgblack.cool.framework.common.pojo.dto.PageQuery; import com.xgblack.cool.framework.common.pojo.dto.Query; import lombok.Getter; import lombok.Setter; @@ -19,7 +20,7 @@ import static com.xgblack.cool.framework.common.utils.date.DateUtils.FORMAT_YEAR @Setter @ToString @Accessors(chain = true) -public class RolePageQry extends Query { +public class RolePageQry extends PageQuery { private String name; diff --git a/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/clientobject/MenuCO.java b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/clientobject/MenuCO.java new file mode 100644 index 0000000000000000000000000000000000000000..bff056252a276aa16563b5c5cf85a37896a3081b --- /dev/null +++ b/cool-module-system/cool-module-system-client/src/main/java/com/xgblack/cool/module/system/dto/permission/clientobject/MenuCO.java @@ -0,0 +1,100 @@ +package com.xgblack.cool.module.system.dto.permission.clientobject; + +import com.xgblack.cool.framework.common.pojo.ClientObject; +import com.xgblack.cool.module.system.common.enums.permission.MenuTypeEnum; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class MenuCO extends ClientObject { + /** + * 菜单编号 + */ + private Long id; + + /** + * 菜单名称 + */ + private String name; + /** + * 权限标识 + * + * 一般格式为:${系统}:${模块}:${操作} + * 例如说:system:admin:add,即 system 服务的添加管理员。 + * + * 当我们把该 MenuDO 赋予给角色后,意味着该角色有该资源: + * - 对于后端,配合 @PreAuthorize 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 + * - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。 + */ + private String permission; + /** + * 菜单类型 + * + * 枚举 {@link MenuTypeEnum} + */ + private Integer type; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 父菜单ID + */ + private Long parentId; + /** + * 路由地址 + * + * 如果 path 为 http(s) 时,则它是外链 + */ + private String path; + /** + * 菜单图标 + */ + private String icon; + /** + * 组件路径 + */ + private String component; + /** + * 组件名 + */ + private String componentName; + + /** + * 状态 + */ + private Boolean status; + /** + * 是否可见 + * + * 只有菜单、目录使用 + * 当设置为 true 时,该菜单不会展示在侧边栏,但是路由还是存在。例如说,一些独立的编辑页面 /edit/1024 等等 + */ + private Boolean visible; + /** + * 是否缓存 + * + * 只有菜单、目录使用,否使用 Vue 路由的 keep-alive 特性 + * 注意:如果开启缓存,则必须填写 {@link #componentName} 属性,否则无法缓存 + */ + private Boolean keepAlive; + /** + * 是否总是显示 + * + * 如果为 false 时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单 + */ + private Boolean alwaysShow; + + private LocalDateTime createTime; +} diff --git a/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/PermissionGateway.java b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/PermissionGateway.java new file mode 100644 index 0000000000000000000000000000000000000000..bda9401f21a059bbf6e1c42cc7d8b90f0c26317d --- /dev/null +++ b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/PermissionGateway.java @@ -0,0 +1,16 @@ +package com.xgblack.cool.module.system.domain.gateway; + +import java.util.Set; + +/** + * @author xg black + */ + +public interface PermissionGateway { + + Set getRoleIdsByUserId(Long userId); + + void insertUserRole(Long userId, Set roleIds); + + void deleteUserRole(Long userId, Set roleIds); +} diff --git a/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/RoleGateway.java b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/RoleGateway.java index bddb9adf6d04dd3bb0b2fe76aa437f236e348f76..61c43c46dad01be6e288dd30852a595d37f98155 100644 --- a/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/RoleGateway.java +++ b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/gateway/RoleGateway.java @@ -1,9 +1,24 @@ package com.xgblack.cool.module.system.domain.gateway; +import com.xgblack.cool.framework.common.pojo.dto.PageResult; +import com.xgblack.cool.module.system.domain.permission.Role; +import com.xgblack.cool.module.system.dto.permission.RolePageQry; + /** * @author xg black */ public interface RoleGateway { + void create(Role role); + + void delete(Long id); + + void update(Role role); + + Role getById(Long id); + + PageResult getPage(RolePageQry qry); + + void updateStatus(Long id, Boolean status); } diff --git a/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/permission/Menu.java b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/permission/Menu.java new file mode 100644 index 0000000000000000000000000000000000000000..0b8cd8d691158c41fd6bf64b2ba99b72a2cf7990 --- /dev/null +++ b/cool-module-system/cool-module-system-domain/src/main/java/com/xgblack/cool/module/system/domain/permission/Menu.java @@ -0,0 +1,101 @@ +package com.xgblack.cool.module.system.domain.permission; + +import com.xgblack.cool.module.system.common.enums.permission.MenuTypeEnum; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * @author xg black + */ + +@Getter +@Setter +@ToString +@Accessors(chain = true) +public class Menu { + + /** + * 菜单编号 + */ + private Long id; + + /** + * 菜单名称 + */ + private String name; + /** + * 权限标识 + * + * 一般格式为:${系统}:${模块}:${操作} + * 例如说:system:admin:add,即 system 服务的添加管理员。 + * + * 当我们把该 MenuDO 赋予给角色后,意味着该角色有该资源: + * - 对于后端,配合 @PreAuthorize 注解,配置 API 接口需要该权限,从而对 API 接口进行权限控制。 + * - 对于前端,配合前端标签,配置按钮是否展示,避免用户没有该权限时,结果可以看到该操作。 + */ + private String permission; + /** + * 菜单类型 + * + * 枚举 {@link MenuTypeEnum} + */ + private Integer type; + /** + * 显示顺序 + */ + private Integer sort; + /** + * 父菜单ID + */ + private Long parentId; + /** + * 路由地址 + * + * 如果 path 为 http(s) 时,则它是外链 + */ + private String path; + /** + * 菜单图标 + */ + private String icon; + /** + * 组件路径 + */ + private String component; + /** + * 组件名 + */ + private String componentName; + + /** + * 状态 + */ + private Boolean status; + /** + * 是否可见 + * + * 只有菜单、目录使用 + * 当设置为 true 时,该菜单不会展示在侧边栏,但是路由还是存在。例如说,一些独立的编辑页面 /edit/1024 等等 + */ + private Boolean visible; + /** + * 是否缓存 + * + * 只有菜单、目录使用,否使用 Vue 路由的 keep-alive 特性 + * 注意:如果开启缓存,则必须填写 {@link #componentName} 属性,否则无法缓存 + */ + private Boolean keepAlive; + /** + * 是否总是显示 + * + * 如果为 false 时,当该菜单只有一个子菜单时,不展示自己,直接展示子菜单 + */ + private Boolean alwaysShow; + + private LocalDateTime createTime; + +} diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/MenuConvertor.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/MenuConvertor.java new file mode 100644 index 0000000000000000000000000000000000000000..96b3e477827f1642b513b1850030e662eed48fb1 --- /dev/null +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/MenuConvertor.java @@ -0,0 +1,19 @@ +package com.xgblack.cool.module.system.convertor; + +import com.xgblack.cool.framework.common.convertor.Convertor; +import com.xgblack.cool.module.system.domain.permission.Menu; +import com.xgblack.cool.module.system.dto.permission.clientobject.MenuCO; +import com.xgblack.cool.module.system.gateway.database.dataobject.MenuDO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * @author xg black + */ + +@Mapper +public interface MenuConvertor extends Convertor { + MenuConvertor INSTANCE = Mappers.getMapper(MenuConvertor.class); + + +} diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/RoleConvertor.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/RoleConvertor.java index 3d230054813b4e1c26a6f49c6cd22ec951aba222..92e3aa2a7025b4227fa3c8d5cee0740cb320dbcd 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/RoleConvertor.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/convertor/RoleConvertor.java @@ -2,6 +2,8 @@ package com.xgblack.cool.module.system.convertor; import com.xgblack.cool.framework.common.convertor.Convertor; import com.xgblack.cool.module.system.domain.permission.Role; +import com.xgblack.cool.module.system.dto.permission.RoleAddCmd; +import com.xgblack.cool.module.system.dto.permission.RoleEditCmd; import com.xgblack.cool.module.system.dto.permission.clientobject.RoleCO; import com.xgblack.cool.module.system.gateway.database.dataobject.RoleDO; import org.mapstruct.Mapper; @@ -14,5 +16,9 @@ import org.mapstruct.factory.Mappers; public interface RoleConvertor extends Convertor { RoleConvertor INSTANCE = Mappers.getMapper(RoleConvertor.class); + Role toEntity(RoleAddCmd cmd); + + Role toEntity(RoleEditCmd cmd); + } diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/PermissionGatewayImpl.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/PermissionGatewayImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..98d31cc24c6af8e789aea0371b7b08ff2467df1c --- /dev/null +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/PermissionGatewayImpl.java @@ -0,0 +1,68 @@ +package com.xgblack.cool.module.system.gateway; + +import com.mybatisflex.core.query.QueryChain; +import com.mybatisflex.core.query.QueryWrapper; +import com.xgblack.cool.module.system.domain.gateway.PermissionGateway; +import com.xgblack.cool.module.system.gateway.database.dataobject.UserRoleDO; +import com.xgblack.cool.module.system.gateway.database.dataobject.table.UserRoleTableDef; +import com.xgblack.cool.module.system.gateway.database.mapper.UserRoleMapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.hutool.core.collection.CollUtil; +import org.dromara.hutool.core.collection.ListUtil; +import org.dromara.hutool.core.collection.set.SetUtil; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; + +/** + * @author xg black + */ + +@Slf4j +@Component +@RequiredArgsConstructor +public class PermissionGatewayImpl implements PermissionGateway { + + private final UserRoleMapper userRoleMapper; + + + @Override + public Set getRoleIdsByUserId(Long userId) { + List roleIds = QueryChain.of(userRoleMapper) + .select(UserRoleTableDef.USER_ROLE.ROLE_ID) + .from(UserRoleTableDef.USER_ROLE) + .and(UserRoleTableDef.USER_ROLE.USER_ID.eq(userId)) + .objListAs(Long.class); + if (CollUtil.isEmpty(roleIds)) { + return SetUtil.empty(); + } + return SetUtil.of(roleIds); + } + + @Override + public void insertUserRole(Long userId, Set roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return; + } + List list = ListUtil.empty(); + for (Long roleId : roleIds) { + list.add(new UserRoleDO().setRoleId(roleId).setUserId(userId)); + } + userRoleMapper.insertBatch(list); + } + + @Override + public void deleteUserRole(Long userId, Set roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return; + } + QueryWrapper query = QueryWrapper.create() + .from(UserRoleTableDef.USER_ROLE) + .and(UserRoleTableDef.USER_ROLE.ROLE_ID.in(roleIds)); + userRoleMapper.deleteByQuery(query); + } + + +} diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/RoleGatewayImpl.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/RoleGatewayImpl.java index 3d5c72ec24da36de4a9176e0fd6dbfa35d4c8c39..13328ea2858bf3b1ddfa2d8caa307590d4ca22cf 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/RoleGatewayImpl.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/RoleGatewayImpl.java @@ -1,8 +1,17 @@ package com.xgblack.cool.module.system.gateway; +import com.mybatisflex.core.query.QueryChain; +import com.mybatisflex.core.update.UpdateChain; +import com.xgblack.cool.framework.common.pojo.dto.PageResult; +import com.xgblack.cool.module.system.convertor.RoleConvertor; import com.xgblack.cool.module.system.domain.gateway.RoleGateway; +import com.xgblack.cool.module.system.domain.permission.Role; +import com.xgblack.cool.module.system.dto.permission.RolePageQry; +import com.xgblack.cool.module.system.gateway.database.dataobject.table.RoleTableDef; +import com.xgblack.cool.module.system.gateway.database.mapper.RoleMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.hutool.core.text.StrUtil; import org.springframework.stereotype.Component; /** @@ -14,4 +23,49 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class RoleGatewayImpl implements RoleGateway { + private final RoleMapper roleMapper; + + private final static RoleConvertor convertor = RoleConvertor.INSTANCE; + + @Override + public void create(Role role) { + roleMapper.insertSelective(convertor.toDataObject(role)); + } + + @Override + public void delete(Long id) { + roleMapper.deleteById(id); + } + + @Override + public void update(Role role) { + roleMapper.update(convertor.toDataObject(role)); + } + + @Override + public Role getById(Long id) { + return convertor.convertDO2Entity(roleMapper.selectOneById(id)); + } + + @Override + public PageResult getPage(RolePageQry qry) { + return PageResult.of( + QueryChain.of(roleMapper) + .from(RoleTableDef.ROLE) + .and(RoleTableDef.ROLE.NAME.like(qry.getName(), StrUtil.isNotBlank(qry.getName()))) + .and(RoleTableDef.ROLE.CODE.eq(qry.getCode(), StrUtil.isNotBlank(qry.getCode()))) + .and(RoleTableDef.ROLE.STATUS.eq(qry.getStatus(), qry.getStatus() != null)) + .and(RoleTableDef.ROLE.CREATE_TIME.between(qry.getCreateTime(), qry.getCreateTime() != null)) + .orderBy(RoleTableDef.ROLE.ID.desc()) + .pageAs(qry.buildPage(), Role.class) + ); + } + + @Override + public void updateStatus(Long id, Boolean status) { + UpdateChain.of(roleMapper) + .set(RoleTableDef.ROLE.STATUS, status) + .where(RoleTableDef.ROLE.ID.eq(id)) + .update(); + } } diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/UserGatewayImpl.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/UserGatewayImpl.java index 83d33ac9555bc6d6656698a7f5a29b25145d2d8e..14c77cca7dda54360ccf318eedec1af0cd3311cf 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/UserGatewayImpl.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/UserGatewayImpl.java @@ -30,6 +30,8 @@ public class UserGatewayImpl implements UserGateway, RemoteUserService { private final UserMapper userMapper; + private final static UserConvertor convertor = UserConvertor.INSTANCE; + @Override public UserInfo info(String username, String phone) { SysUser sysUser = QueryChain.of(userMapper) @@ -55,17 +57,17 @@ public class UserGatewayImpl implements UserGateway, RemoteUserService { @Override public void create(User user) { - userMapper.insertSelective(UserConvertor.INSTANCE.toDataObject(user)); + userMapper.insertSelective(convertor.toDataObject(user)); } @Override public User getById(Long id) { - return UserConvertor.INSTANCE.convertDO2Entity(userMapper.selectOneById(id)); + return convertor.convertDO2Entity(userMapper.selectOneById(id)); } @Override public void update(User user) { - userMapper.update(UserConvertor.INSTANCE.toDataObject(user)); + userMapper.update(convertor.toDataObject(user)); } @Override diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/MenuDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/MenuDO.java index 9a4200ba85baaa68ab499082ac774fffe8d7555a..72dd0dbd7a260dd3bd074ccb8ebbf4b94ce1a750 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/MenuDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/MenuDO.java @@ -79,12 +79,11 @@ public class MenuDO extends TenantBaseDO { * 组件名 */ private String componentName; + /** * 状态 - * - * 枚举 {@link CommonStatusEnum} */ - private Integer status; + private Boolean status; /** * 是否可见 * diff --git a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserRoleDO.java b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserRoleDO.java index 4201837f0c8820bead928f26fa95db5bd21514e4..d49a90b226cbdd79527a504d8332d504f4dc6995 100644 --- a/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserRoleDO.java +++ b/cool-module-system/cool-module-system-infrastructure/src/main/java/com/xgblack/cool/module/system/gateway/database/dataobject/UserRoleDO.java @@ -1,6 +1,5 @@ package com.xgblack.cool.module.system.gateway.database.dataobject; -import com.mybatisflex.annotation.Column; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; @@ -37,10 +36,5 @@ public class UserRoleDO extends TenantBaseDO { */ private Long roleId; - /** - * 是否删除 - */ - @Column(isLogicDelete = true) - private Boolean deleted; } diff --git a/pom.xml b/pom.xml index 4d3dbae5afdc447ed9417b853daa09c5ae0ef03f..c057c616de21918206ba60b922869636aa5f6d05 100644 --- a/pom.xml +++ b/pom.xml @@ -59,7 +59,7 @@ 1.18.30 1.6.0.Beta1 - 1.7.9 + 1.8.0 @@ -164,8 +164,8 @@ - aliyun - https://maven.aliyun.com/repository/public + repo-huawei + https://repo.huaweicloud.com/repository/maven/ ossrh