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