refactor: 重构菜单内容

This commit is contained in:
bunny 2025-04-25 16:16:57 +08:00
parent a201b965d7
commit 499876773f
56 changed files with 642 additions and 3508 deletions

View File

@ -71,7 +71,6 @@ public class DatabaseBackupJob implements Job {
StringBuilder stringBuilder = new StringBuilder();
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
System.out.println(line);
}
jobDataMap.put("output", stringBuilder.toString());
}

View File

@ -1,7 +1,7 @@
package cn.bunny.services.security.custom;
import cn.bunny.domain.constant.RedisUserConstant;
import cn.bunny.domain.system.entity.Power;
import cn.bunny.domain.system.entity.Permission;
import cn.bunny.domain.system.entity.Role;
import cn.bunny.domain.vo.LoginVo;
import cn.bunny.domain.vo.result.ResultCodeEnum;
@ -116,10 +116,10 @@ public class CustomAuthorizationManagerServiceImpl implements AuthorizationManag
if (requestURI.contains("noManage")) return true;
// 根据角色列表查询权限信息
List<Power> powerList = powerMapper.selectListByUserId(userId);
List<Permission> permissionList = powerMapper.selectListByUserId(userId);
// 判断是否与请求路径匹配
return powerList.stream().map(Power::getRequestUrl)
return permissionList.stream().map(Permission::getRequestUrl)
.filter(Objects::nonNull)
.anyMatch(requestUrl -> {
if ((requestUrl.contains("/*") || requestUrl.contains("/**"))) {

View File

@ -36,15 +36,15 @@ public class MenuIconController {
private MenuIconService menuIconService;
@Operation(summary = "分页查询系统菜单图标", description = "分页查询系统菜单图标")
@GetMapping("getMenuIconList/{page}/{limit}")
public Result<PageResult<MenuIconVo>> getMenuIconList(
@GetMapping("menuIconList/{page}/{limit}")
public Result<PageResult<MenuIconVo>> menuIconList(
@Parameter(name = "page", description = "当前页", required = true)
@PathVariable("page") Integer page,
@Parameter(name = "limit", description = "每页记录数", required = true)
@PathVariable("limit") Integer limit,
MenuIconDto dto) {
Page<MenuIcon> pageParams = new Page<>(page, limit);
PageResult<MenuIconVo> pageResult = menuIconService.getMenuIconList(pageParams, dto);
PageResult<MenuIconVo> pageResult = menuIconService.menuIconList(pageParams, dto);
return Result.success(pageResult);
}

View File

@ -1,10 +1,10 @@
package cn.bunny.services.controller.system;
import cn.bunny.domain.system.entity.Power;
import cn.bunny.domain.system.dto.power.PowerAddDto;
import cn.bunny.domain.system.dto.power.PowerDto;
import cn.bunny.domain.system.dto.power.PowerUpdateBatchByParentIdDto;
import cn.bunny.domain.system.dto.power.PowerUpdateDto;
import cn.bunny.domain.system.entity.Permission;
import cn.bunny.domain.system.vo.PowerVo;
import cn.bunny.domain.vo.result.PageResult;
import cn.bunny.domain.vo.result.Result;
@ -44,7 +44,7 @@ public class PowerController {
@Parameter(name = "limit", description = "每页记录数", required = true)
@PathVariable("limit") Integer limit,
PowerDto dto) {
Page<Power> pageParams = new Page<>(page, limit);
Page<Permission> pageParams = new Page<>(page, limit);
PageResult<PowerVo> pageResult = powerService.getPowerList(pageParams, dto);
return Result.success(pageResult);
}

View File

@ -1,19 +1,13 @@
package cn.bunny.services.controller.system;
import cn.bunny.domain.system.entity.Router;
import cn.bunny.domain.system.dto.router.RouterAddDto;
import cn.bunny.domain.system.dto.router.RouterManageDto;
import cn.bunny.domain.system.dto.router.RouterUpdateByIdWithRankDto;
import cn.bunny.domain.system.dto.router.RouterUpdateDto;
import cn.bunny.domain.system.vo.router.RouterManageVo;
import cn.bunny.domain.system.vo.router.UserRouterVo;
import cn.bunny.domain.vo.result.PageResult;
import cn.bunny.domain.system.vo.router.WebUserRouterVo;
import cn.bunny.domain.vo.result.Result;
import cn.bunny.domain.vo.result.ResultCodeEnum;
import cn.bunny.services.service.system.RouterService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
@ -38,31 +32,16 @@ public class RouterController {
private RouterService routerService;
@Operation(summary = "获取用户菜单", description = "获取用户菜单")
@GetMapping("noManage/getRouterAsync")
public Result<List<UserRouterVo>> getRouterAsync() {
List<UserRouterVo> voList = routerService.getRouterAsync();
@GetMapping("noManage/routerAsync")
public Result<List<WebUserRouterVo>> routerAsync() {
List<WebUserRouterVo> voList = routerService.routerAsync();
return Result.success(voList);
}
@Operation(summary = "分页管理菜单列", description = "分页管理菜单列")
@GetMapping("getMenusList/{page}/{limit}")
public Result<PageResult<RouterManageVo>> getMenusByPage(
@Parameter(name = "page", description = "当前页", required = true)
@PathVariable("page") Integer page,
@Parameter(name = "limit", description = "每页记录数", required = true)
@PathVariable("limit") Integer limit,
RouterManageDto dto) {
Page<Router> pageParams = new Page<>(page, limit);
PageResult<RouterManageVo> voPageResult = routerService.getMenusByPage(pageParams, dto);
return Result.success(voPageResult);
}
@Operation(summary = "分页查询管理菜单列表", description = "分页查询管理菜单列表")
@GetMapping("getMenusList")
public Result<List<RouterManageVo>> getMenusList(RouterManageDto dto) {
List<RouterManageVo> voPageResult = routerService.getMenusList(dto);
@Operation(summary = "查询管理菜单列表", description = "查询管理菜单列表")
@GetMapping("menuList")
public Result<List<RouterManageVo>> menuList() {
List<RouterManageVo> voPageResult = routerService.menuList();
return Result.success(voPageResult);
}
@ -80,13 +59,6 @@ public class RouterController {
return Result.success(ResultCodeEnum.UPDATE_SUCCESS);
}
@Operation(summary = "快速更新菜单排序", description = "快速更新菜单排序")
@PutMapping("updateMenuByIdWithRank")
public Result<Object> updateMenuByIdWithRank(@Valid @RequestBody RouterUpdateByIdWithRankDto dto) {
routerService.updateMenuByIdWithRank(dto);
return Result.success(ResultCodeEnum.UPDATE_SUCCESS);
}
@Operation(summary = "删除路由菜单", description = "删除路由菜单")
@DeleteMapping("deletedMenuByIds")
public Result<Object> deletedMenuByIds(@RequestBody List<Long> ids) {

View File

@ -1,11 +1,10 @@
package cn.bunny.services.controller.system;
import cn.bunny.domain.system.dto.router.AssignRolesToRoutersDto;
import cn.bunny.domain.vo.result.Result;
import cn.bunny.services.service.system.RouterRoleService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@ -23,7 +22,7 @@ import java.util.List;
@RequestMapping("api/routerRole")
public class RouterRoleController {
@Autowired
@Resource
private RouterRoleService routerRoleService;
@Operation(summary = "根据菜单id获取所有角色", description = "根据菜单id获取所有角色")
@ -33,20 +32,6 @@ public class RouterRoleController {
return Result.success(roleListByRouterId);
}
@Operation(summary = "为菜单分配角色", description = "为菜单分配角色")
@PostMapping("assignRolesToRouter")
public Result<String> assignRolesToRouter(@RequestBody AssignRolesToRoutersDto dto) {
routerRoleService.assignRolesToRouter(dto);
return Result.success();
}
@Operation(summary = "批量为菜单添加角色", description = "批量为菜单添加角色")
@PostMapping("assignAddBatchRolesToRouter")
public Result<String> assignAddBatchRolesToRouter(@RequestBody AssignRolesToRoutersDto dto) {
routerRoleService.assignAddBatchRolesToRouter(dto);
return Result.success();
}
@Operation(summary = "清除选中菜单所有角色", description = "清除选中菜单所有角色")
@DeleteMapping("clearAllRolesSelect")
public Result<String> clearAllRolesSelect(@RequestBody List<Long> routerIds) {

View File

@ -1,30 +0,0 @@
package cn.bunny.domain.system.dto.router;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "AssignRolesToRoutersDto对象", title = "路由分配角色", description = "路由分配角色")
public class AssignRolesToRoutersDto {
@Schema(name = "routerId", title = "路由id")
@NotNull(message = "路由id不能为空")
@NotEmpty(message = "路由id不能为空")
private List<Long> routerIds;
@Schema(name = "roleIds", title = "角色id列表")
@NotNull(message = "角色id列表不能为空")
@NotEmpty(message = "角色id列表不能为空")
private List<Long> roleIds;
}

View File

@ -1,8 +1,7 @@
package cn.bunny.domain.system.dto.router;
import com.fasterxml.jackson.annotation.JsonProperty;
import cn.bunny.domain.system.entity.RouterMeta;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
@ -17,46 +16,29 @@ import lombok.NoArgsConstructor;
@Schema(name = "RouterManageDto对象", title = "添加路由", description = "添加路由")
public class RouterAddDto {
@Schema(name = "menuType", title = "菜单类型")
@NotNull(message = "菜单类型不能为空")
private Integer menuType;
@Schema(name = "parentId", title = "父级id")
private Long parentId;
@Schema(name = "title", title = "路由title")
@NotNull(message = "菜单名称不能为空")
@NotBlank(message = "菜单名称不能为空")
private String title;
@Schema(name = "routeName", title = "路由名称")
@JsonProperty("name")
@NotBlank(message = "路由名称不能为空")
@NotNull(message = "路由名称不能为空")
private String routeName;
@Schema(name = "path", title = "在项目中路径")
@NotBlank(message = "路由路径不能为空")
@NotNull(message = "路由路径不能为空")
private String path;
@Schema(name = "routeName", title = "路由名称")
@NotBlank(message = "路由名称不能为空")
private String routeName;
@Schema(name = "redirect", title = "路由重定向")
private String redirect;
@Schema(name = "component", title = "组件位置")
private String component;
@Schema(name = "routerRank", title = "等级")
@JsonProperty("rank")
@NotNull(message = "菜单排序不能为空")
@Max(value = 999, message = "不能超过999")
private Integer routerRank = 99;
@Schema(name = "menuType", title = "菜单类型")
@NotNull(message = "菜单类型不能为空")
private Integer menuType;
@Schema(name = "icon", title = "图标")
private String icon;
@Schema(name = "frameSrc", title = "frame路径")
private String frameSrc;
@Schema(name = "visible", title = "是否显示")
private Boolean visible = false;
@Schema(name = "meta", title = "菜单meta")
private RouterMeta meta;
}

View File

@ -1,21 +0,0 @@
package cn.bunny.domain.system.dto.router;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "RouterManageDto对象", title = "路由分页查询", description = "路由分页查询")
public class RouterManageDto {
@Schema(name = "title", title = "路由标题")
private String title;
@Schema(name = "visible", title = "是否显示")
private Boolean visible;
}

View File

@ -1,26 +0,0 @@
package cn.bunny.domain.system.dto.router;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Schema(name = "RouterUpdateByIdWithRankDto对象", title = "根据菜单Id更新菜单排序", description = "根据菜单Id更新菜单排序")
public class RouterUpdateByIdWithRankDto {
@Schema(name = "id", title = "唯一标识")
@NotNull(message = "id不能为空")
private Long id;
@Schema(name = "routerRank", title = "等级")
@JsonProperty("rank")
private Integer routerRank;
}

View File

@ -1,8 +1,7 @@
package cn.bunny.domain.system.dto.router;
import com.fasterxml.jackson.annotation.JsonProperty;
import cn.bunny.domain.system.entity.RouterMeta;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
@ -21,44 +20,29 @@ public class RouterUpdateDto {
@NotNull(message = "id不能为空")
private Long id;
@Schema(name = "menuType", title = "菜单类型")
@NotNull(message = "菜单类型不能为空")
private Integer menuType;
@Schema(name = "parentId", title = "父级id")
private Long parentId;
@Schema(name = "title", title = "路由title")
@NotBlank(message = "菜单名称不能为空")
@NotNull(message = "菜单名称不能为空")
private String title;
@Schema(name = "routeName", title = "路由名称")
@JsonProperty("name")
@NotBlank(message = "路由名称不能为空")
@NotNull(message = "路由名称不能为空")
private String routeName;
@Schema(name = "path", title = "在项目中路径")
@NotBlank(message = "路由路径不能为空")
@NotNull(message = "路由路径不能为空")
private String path;
@Schema(name = "routeName", title = "路由名称")
@NotBlank(message = "路由名称不能为空")
private String routeName;
@Schema(name = "redirect", title = "路由重定向")
private String redirect;
@Schema(name = "component", title = "组件位置")
private String component;
@Schema(name = "routerRank", title = "等级")
@JsonProperty("rank")
@Max(value = 999, message = "不能超过999")
private Integer routerRank;
@Schema(name = "menuType", title = "菜单类型")
@NotNull(message = "菜单类型不能为空")
private Integer menuType;
@Schema(name = "icon", title = "图标")
private String icon;
@Schema(name = "meta", title = "菜单meta")
private RouterMeta meta;
@Schema(name = "frameSrc", title = "frame路径")
private String frameSrc;
@Schema(name = "visible", title = "是否显示")
private Boolean visible;
}

View File

@ -68,5 +68,6 @@ public class AdminUser extends BaseEntity implements UserDetails {
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
}

View File

@ -8,9 +8,9 @@ import lombok.Setter;
@Getter
@Setter
@TableName("sys_power")
@TableName("sys_permission")
@Schema(name = "Power对象", title = "权限", description = "权限")
public class Power extends BaseEntity {
public class Permission extends BaseEntity {
@Schema(name = "parentId", title = "父级id")
private Long parentId;

View File

@ -12,9 +12,9 @@ import lombok.experimental.Accessors;
@Getter
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_role_power")
@TableName("sys_role_permission")
@Schema(name = "RolePower对象", title = "角色权限关系", description = "角色权限关系")
public class RolePower extends BaseEntity {
public class RolePermission extends BaseEntity {
@Schema(name = "roleId", title = "角色id")
private Long roleId;

View File

@ -28,28 +28,20 @@ public class Router extends BaseEntity {
@Schema(name = "path", title = "在项目中路径")
private String path;
@Schema(name = "component", title = "组件位置")
private String component;
@Schema(name = "frameSrc", title = "frame路径")
private String frameSrc;
@Schema(name = "routeName", title = "路由名称")
private String routeName;
@Schema(name = "title", title = "路由title")
private String title;
@Schema(name = "redirect", title = "路由重定向")
private String redirect;
@Schema(name = "component", title = "组件位置")
private String component;
@Schema(name = "menuType", title = "菜单类型")
private Integer menuType;
@Schema(name = "icon", title = "图标")
private String icon;
@Schema(name = "routerRank", title = "等级")
private Integer routerRank;
@Schema(name = "visible", title = "是否显示")
private Boolean visible;
@Schema(name = "meta", title = "路由meta")
private String meta;
}

View File

@ -0,0 +1,62 @@
package cn.bunny.domain.system.entity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RouterMeta {
@Schema(name = "title", title = "路由title")
private String title = "";
@Schema(name = "icon", title = "图标")
private String icon;
@Schema(name = "showLink", title = "是否显示菜单")
private Boolean showLink = true;
@Schema(name = "showParent", title = "是否显示父级菜单")
private Boolean showParent = true;
@Schema(name = "roles", title = "页面级别权限设置")
private List<String> roles = new ArrayList<>();
@Schema(name = "auths", title = "按钮级别权限设置")
private List<String> auths = new ArrayList<>();
@Schema(name = "keepAlive", title = "是否缓存该路由页面(开启后,会保存该页面的整体状态,刷新后会清空状态)")
private Boolean keepAlive;
@Schema(name = "frameSrc", title = "frame路径")
private String frameSrc;
@Schema(name = "frameLoading", title = "等级")
private Boolean frameLoading;
@Schema(name = "rank", title = "等级")
private Integer rank;
@Schema(name = "fixedTag", title = "固定标签页")
private Boolean fixedTag;
@Schema(name = "hiddenTag", title = "当前菜单名称或自定义信息禁止添加到标签页")
private Boolean hiddenTag;
@Schema(name = "activePath", title = "将某个菜单激活")
private String activePath;
@Schema(name = "transition", title = "页面加载动画")
private RouterMetaTransition transition;
}

View File

@ -0,0 +1,21 @@
package cn.bunny.domain.system.entity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RouterMetaTransition {
@Schema(name = "enterTransition", title = "入场动画")
private String enterTransition;
@Schema(name = "leaveTransition", title = "离场动画")
private String leaveTransition;
}

View File

@ -19,4 +19,5 @@ public class RouterRole extends BaseEntity {
@Schema(name = "roleId", title = "角色ID")
private Long roleId;
}
}

View File

@ -1,4 +1,4 @@
package cn.bunny.domain.views;
package cn.bunny.domain.system.views;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
@ -9,9 +9,9 @@ import lombok.experimental.Accessors;
@Setter
@Getter
@Accessors(chain = true)
@TableName("sys_role_power")
@TableName("sys_role_permission")
@Schema(name = "ViewRolePower对象", title = "角色权限关系视图", description = "角色权限关系视图")
public class ViewRolePower {
public class ViewRolePermission {
@Schema(name = "roleId", title = "角色ID")
private Long roleId;

View File

@ -1,4 +1,4 @@
package cn.bunny.domain.views;
package cn.bunny.domain.system.views;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
@ -22,29 +22,20 @@ public class ViewRouterRole {
@Schema(name = "path", title = "在项目中路径")
private String path;
@Schema(name = "component", title = "组件位置")
private String component;
@Schema(name = "frameSrc", title = "frame路径")
private String frameSrc;
@Schema(name = "routeName", title = "路由名称")
private String routeName;
@Schema(name = "title", title = "路由title")
private String title;
@Schema(name = "redirect", title = "路由重定向")
private String redirect;
@Schema(name = "component", title = "组件位置")
private String component;
@Schema(name = "menuType", title = "菜单类型")
private Integer menuType;
@Schema(name = "icon", title = "图标")
private String icon;
@Schema(name = "routerRank", title = "等级")
private Integer routerRank;
@Schema(name = "visible", title = "是否显示")
private Boolean visible;
@Schema(name = "meta", title = "路由meta")
private String meta;
@Schema(name = "roleId", title = "角色ID")
private Long roleId;

View File

@ -1,4 +1,4 @@
package cn.bunny.domain.views;
package cn.bunny.domain.system.views;
import cn.bunny.domain.entity.BaseUserEntity;
import com.baomidou.mybatisplus.annotation.TableName;
@ -36,7 +36,7 @@ public class ViewUserDept extends BaseUserEntity {
@Schema(name = "password", title = "密码")
private String password;
@Schema(name = "avatar", title = "头像")
private String avatar;

View File

@ -5,11 +5,11 @@ import com.alibaba.fastjson2.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import jakarta.validation.constraints.NotBlank;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.ArrayList;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@ -17,7 +17,7 @@ import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "RouterControllerVo对象", description = "路由管理端返回对象")
@Schema(name = "RouterControllerVo对象", title = "管理员用户看到菜单内容", description = "管理员用户管理菜单")
public class RouterManageVo extends BaseUserVo {
@ApiModelProperty("父级id")
@ -26,36 +26,67 @@ public class RouterManageVo extends BaseUserVo {
@JSONField(serializeUsing = ToStringSerializer.class)
private Long parentId;
@ApiModelProperty("在项目中路径")
@Schema(name = "path", title = "在项目中路径")
private String path;
@ApiModelProperty("组件位置")
private String component;
@ApiModelProperty("frame路径")
private String frameSrc;
@ApiModelProperty("路由名称")
@NotBlank(message = "路由名称不能为空")
@JsonProperty("name")
@Schema(name = "routeName", title = "路由名称")
private String routeName;
@ApiModelProperty("路由title")
private String title;
@Schema(name = "redirect", title = "路由重定向")
private String redirect;
@ApiModelProperty("菜单类型")
@Schema(name = "component", title = "组件位置")
private String component;
@Schema(name = "menuType", title = "菜单类型")
private Integer menuType;
@ApiModelProperty("图标")
@Schema(name = "title", title = "路由title")
private String title;
@Schema(name = "icon", title = "图标")
private String icon;
@ApiModelProperty("等级")
@JsonProperty("rank")
private Integer routerRank;
@Schema(name = "showLink", title = "是否显示菜单")
private Boolean showLink;
@ApiModelProperty("是否显示")
private Boolean visible;
@Schema(name = "showParent", title = "是否显示父级菜单")
private Boolean showParent;
@Schema(name = "roles", title = "页面级别权限设置")
private List<String> roles;
@Schema(name = "auths", title = "按钮级别权限设置")
private List<String> auths;
@Schema(name = "keepAlive", title = "是否缓存该路由页面(开启后,会保存该页面的整体状态,刷新后会清空状态)")
private Boolean keepAlive;
@Schema(name = "frameSrc", title = "frame路径")
private String frameSrc;
@Schema(name = "frameLoading", title = "等级")
private Boolean frameLoading;
@Schema(name = "rank", title = "等级")
private Integer rank;
@Schema(name = "hiddenTag", title = "当前菜单名称或自定义信息禁止添加到标签页")
private Boolean hiddenTag;
@Schema(name = "fixedTag", title = "固定标签页")
private Boolean fixedTag;
@Schema(name = "activePath", title = "将某个菜单激活")
private String activePath;
@Schema(name = "enterTransition", title = "入场动画")
private String enterTransition;
@Schema(name = "leaveTransition", title = "离场动画")
private String leaveTransition;
@ApiModelProperty("子路由")
private List<RouterManageVo> children;
private List<RouterManageVo> children = new ArrayList<>();
}

View File

@ -1,37 +0,0 @@
package cn.bunny.domain.system.vo.router;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "UserRouterMetaVo对象", description = "系统属性内容")
public class RouterMeta {
@ApiModelProperty(value = "图标")
private String icon;
@ApiModelProperty(value = "标题")
private String title;
@ApiModelProperty(value = "排序权重")
private Integer rank;
@ApiModelProperty(value = "角色列表")
private List<String> roles;
@ApiModelProperty(value = "权限列表")
private List<String> auths;
@ApiModelProperty("frame路径")
private String frameSrc;
}

View File

@ -0,0 +1,36 @@
package cn.bunny.domain.system.vo.router;
import cn.bunny.domain.vo.BaseUserVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@EqualsAndHashCode(callSuper = true)
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Schema(name = "RouterVo对象", title = "Router返回对象,含用户名等继承 BaseUserVo", description = "Router返回对象包含用户名等返回信息")
public class RouterVo extends BaseUserVo {
@Schema(name = "parentId", title = "父级id")
private Long parentId;
@Schema(name = "path", title = "在项目中路径")
private String path;
@Schema(name = "routeName", title = "路由名称")
private String routeName;
@Schema(name = "redirect", title = "路由重定向")
private String redirect;
@Schema(name = "component", title = "组件位置")
private String component;
@Schema(name = "menuType", title = "菜单类型")
private Integer menuType;
@Schema(name = "meta", title = "路由meta")
private String meta;
}

View File

@ -1,10 +1,10 @@
package cn.bunny.domain.system.vo.router;
import cn.bunny.domain.system.entity.RouterMeta;
import com.alibaba.fastjson2.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
@ -18,8 +18,8 @@ import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@ApiModel(value = "UserRouterVo对象", description = "系统菜单表")
public class UserRouterVo {
@Schema(name = "UserRouterVo对象", title = "前端用户显示路由菜单", description = "前端展示侧边栏和用户菜单内容")
public class WebUserRouterVo {
@Schema(name = "id", title = "主键")
@JsonProperty("id")
@ -27,35 +27,32 @@ public class UserRouterVo {
@JSONField(serializeUsing = ToStringSerializer.class)
private Long id;
@ApiModelProperty("菜单类型")
private Integer menuType;
@ApiModelProperty("父级id")
@JsonProperty("parentId")
@JsonFormat(shape = JsonFormat.Shape.STRING)
@JSONField(serializeUsing = ToStringSerializer.class)
@Schema(name = "parentId", title = "父级id")
private Long parentId;
@ApiModelProperty("菜单名称")
private String title;
@ApiModelProperty("路由名称")
@JsonProperty("name")
private String routeName;
@ApiModelProperty("在项目中路径")
@Schema(name = "path", title = "在项目中路径")
private String path;
@ApiModelProperty("组件位置")
@JsonProperty("name")
@Schema(name = "routeName", title = "路由名称")
private String routeName;
@Schema(name = "redirect", title = "路由重定向")
private String redirect;
@Schema(name = "component", title = "组件位置")
private String component;
@ApiModelProperty("等级")
@JsonProperty("rank")
private Integer routerRank;
@Schema(name = "menuType", title = "菜单类型")
private Integer menuType;
@ApiModelProperty("路由Meta")
@Schema(name = "meta", title = "路由meta")
private RouterMeta meta;
@ApiModelProperty("子路由")
private List<UserRouterVo> children;
private List<WebUserRouterVo> children;
}

View File

@ -1,7 +1,7 @@
package cn.bunny.services.mapper.system;
import cn.bunny.domain.system.entity.Power;
import cn.bunny.domain.system.dto.power.PowerDto;
import cn.bunny.domain.system.entity.Permission;
import cn.bunny.domain.system.vo.PowerVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -20,7 +20,7 @@ import java.util.List;
* @since 2024-10-03 16:00:52
*/
@Mapper
public interface PowerMapper extends BaseMapper<Power> {
public interface PowerMapper extends BaseMapper<Permission> {
/**
* * 分页查询权限内容
@ -29,7 +29,7 @@ public interface PowerMapper extends BaseMapper<Power> {
* @param dto 权限查询表单
* @return 权限分页结果
*/
IPage<PowerVo> selectListByPage(@Param("page") Page<Power> pageParams, @Param("dto") PowerDto dto);
IPage<PowerVo> selectListByPage(@Param("page") Page<Permission> pageParams, @Param("dto") PowerDto dto);
/**
* 物理删除权限
@ -43,6 +43,6 @@ public interface PowerMapper extends BaseMapper<Power> {
*
* @param userId 用户id
*/
List<Power> selectListByUserId(long userId);
List<Permission> selectListByUserId(long userId);
}

View File

@ -1,7 +1,7 @@
package cn.bunny.services.mapper.system;
import cn.bunny.domain.system.entity.RolePower;
import cn.bunny.domain.views.ViewRolePower;
import cn.bunny.domain.system.entity.RolePermission;
import cn.bunny.domain.system.views.ViewRolePermission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@ -16,7 +16,7 @@ import java.util.List;
* @since 2024-09-26
*/
@Mapper
public interface RolePowerMapper extends BaseMapper<RolePower> {
public interface RolePermissionMapper extends BaseMapper<RolePermission> {
/**
* * 根据权限id列表删除角色权限相关
@ -38,12 +38,12 @@ public interface RolePowerMapper extends BaseMapper<RolePower> {
* @param roleId 角色id
* @return 已选择的权限列表
*/
List<RolePower> selectPowerListByRoleId(Long roleId);
List<RolePermission> selectPowerListByRoleId(Long roleId);
/**
* 查看所有角色关联的权限
*
* @return 角色权限关系视图
*/
List<ViewRolePower> viewRolePowerWithAll();
List<ViewRolePermission> viewRolePowerWithAll();
}

View File

@ -2,13 +2,9 @@ package cn.bunny.services.mapper.system;
import cn.bunny.domain.system.entity.Router;
import cn.bunny.domain.system.dto.router.RouterManageDto;
import cn.bunny.domain.system.vo.router.RouterManageVo;
import cn.bunny.domain.system.vo.router.RouterVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@ -24,42 +20,16 @@ import java.util.List;
public interface RouterMapper extends BaseMapper<Router> {
/**
* * 根据用户id查找路由内容
*
* @param userId 用户id
* @return 路由列表
*/
List<Long> selectListByUserId(Long userId);
/**
* * 递归查询所有父级Id直到查询到父级Id为0
*
* @param ids id列表
* @return 路由列表
*/
List<Router> selectParentListByRouterId(List<Long> ids);
/**
* * 管理菜单列表
*
* @param pageParams 分页想去
* @param dto 路由查询表单
* @return 分页结果
*/
IPage<RouterManageVo> selectListByPage(@Param("page") Page<Router> pageParams, @Param("dto") RouterManageDto dto);
/**
* * 管理菜单列表不分页
*
* @param dto 路由查询表单
* @return 分页结果
*/
List<RouterManageVo> selectAllList(@Param("dto") RouterManageDto dto);
/**
* * 物理删除路由菜单
* 物理删除路由菜单
*
* @param ids 删除id列表
*/
void deleteBatchIdsWithPhysics(List<Long> ids);
/**
* 查询路由列表
*
* @return 用户时间
*/
List<RouterVo> selectMenuList();
}

View File

@ -1,7 +1,7 @@
package cn.bunny.services.mapper.system;
import cn.bunny.domain.system.entity.RouterRole;
import cn.bunny.domain.views.ViewRouterRole;
import cn.bunny.domain.system.views.ViewRouterRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@ -19,30 +19,31 @@ import java.util.List;
public interface RouterRoleMapper extends BaseMapper<RouterRole> {
/**
* 根据路由id删除所有角色和路由信息
* 查看所有路由关联角色
*
* @param routerIds 路由id
* @return 路由角色关系视图列表
*/
void deleteBatchIdsByRouterIdsWithPhysics(List<Long> routerIds);
List<ViewRouterRole> selectRouterRoleList();
/**
* * 根据角色id列表删除角色和路由相关
* 根据路由id删除所有角色和路由信息
*
* @param ids 路由id
*/
void deleteBatchIdsByRouterIdsWithPhysics(List<Long> ids);
/**
* * 根据角色id列表删除角色和路由相关
*
* @param roleIds 角色id列表
*/
void deleteBatchIdsByRoleIdsWithPhysics(List<Long> roleIds);
/**
* 查看所有路由关联角色
*
* @return 路由角色关系视图列表
*/
List<ViewRouterRole> viewRouterRolesWithAll();
/**
* 根据Id列表物理删除路由角色关系表
* 根据Id列表物理删除路由角色关系表
*
* @param ids 路由角色关系表ids
*/
void deleteBatchIdsWithPhysics(List<Long> ids);
}

View File

@ -2,7 +2,7 @@ package cn.bunny.services.mapper.system;
import cn.bunny.domain.system.dto.user.AdminUserDto;
import cn.bunny.domain.system.entity.AdminUser;
import cn.bunny.domain.views.ViewUserDept;
import cn.bunny.domain.system.views.ViewUserDept;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

View File

@ -3,7 +3,7 @@
<mapper namespace="cn.bunny.services.mapper.system.PowerMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.bunny.domain.system.entity.Power">
<resultMap id="BaseResultMap" type="cn.bunny.domain.system.entity.Permission">
<id column="id" property="id"/>
<id column="create_time" property="createTime"/>
<id column="update_time" property="updateTime"/>
@ -25,22 +25,22 @@
<!-- 分页查询权限内容 -->
<select id="selectListByPage" resultType="cn.bunny.domain.system.vo.PowerVo">
select
power.*,
permission.*,
create_user.username as create_username,
update_user.username as update_username
from sys_power power
left join sys_user create_user on create_user.id = power.create_user
left join sys_user update_user on update_user.id = power.update_user
from sys_permission permission
left join sys_user create_user on create_user.id = permission.create_user
left join sys_user update_user on update_user.id = permission.update_user
<where>
power.is_deleted = 0
permission.is_deleted = 0
<if test="dto.powerCode != null and dto.powerCode != ''">
and power.power_code like CONCAT('%',#{dto.powerCode},'%')
and permission.power_code like CONCAT('%',#{dto.powerCode},'%')
</if>
<if test="dto.powerName != null and dto.powerName != ''">
and power.power_name like CONCAT('%',#{dto.powerName},'%')
and permission.power_name like CONCAT('%',#{dto.powerName},'%')
</if>
<if test="dto.requestUrl != null and dto.requestUrl != ''">
and power.request_url like CONCAT('%',#{dto.requestUrl},'%')
and permission.request_url like CONCAT('%',#{dto.requestUrl},'%')
</if>
</where>
</select>
@ -48,7 +48,7 @@
<!-- 物理删除权限 -->
<delete id="deleteBatchIdsWithPhysics">
delete
from sys_power
from sys_permission
where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
@ -56,16 +56,16 @@
</delete>
<!-- 根据用户id查询当前用户所有权限 -->
<select id="selectListByUserId" resultType="cn.bunny.domain.system.entity.Power">
<select id="selectListByUserId" resultType="cn.bunny.domain.system.entity.Permission">
SELECT p.*
FROM sys_user u,
sys_user_role ur,
sys_role_power rp,
sys_power p
sys_user_role ur,
sys_role_permission rp,
sys_permission p
WHERE u.id = ur.user_id
AND u.is_deleted = 0
AND ur.role_id = rp.role_id
AND rp.power_id = p.id
AND u.id = #{userId}
AND u.is_deleted = 0
AND ur.role_id = rp.role_id
AND rp.power_id = p.id
AND u.id = #{userId}
</select>
</mapper>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.bunny.services.mapper.system.RolePowerMapper">
<mapper namespace="cn.bunny.services.mapper.system.RolePermissionMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="cn.bunny.domain.system.entity.RolePower">
<resultMap id="BaseResultMap" type="cn.bunny.domain.system.entity.RolePermission">
<id column="id" property="id"/>
<result column="role_id" property="roleId"/>
<result column="power_id" property="powerId"/>
@ -22,7 +22,7 @@
<!-- 根据权限id列表删除角色权限相关 -->
<delete id="deleteBatchPowerIdsWithPhysics">
delete
from sys_role_power
from sys_role_permission
where power_id in
<foreach collection="powerIds" item="id" open="(" close=")" separator=",">
#{id}
@ -32,7 +32,7 @@
<!-- 根据角色id删除角色权限 -->
<delete id="deleteBatchRoleIdsWithPhysics">
delete
from sys_role_power
from sys_role_permission
where role_id in
<foreach collection="roleIds" item="id" open="(" close=")" separator=",">
#{id}
@ -40,25 +40,25 @@
</delete>
<!-- 根据角色id获取权限内容 -->
<select id="selectPowerListByRoleId" resultType="cn.bunny.domain.system.entity.RolePower">
<select id="selectPowerListByRoleId" resultType="cn.bunny.domain.system.entity.RolePermission">
select *
from sys_role_power
from sys_role_permission
where role_id = #{roleId}
</select>
<!-- 查看所有角色关联的权限 -->
<select id="viewRolePowerWithAll" resultType="cn.bunny.domain.views.ViewRolePower">
<select id="viewRolePowerWithAll" resultType="cn.bunny.domain.system.views.ViewRolePermission">
SELECT rp.power_id,
power.parent_id,
power.power_code,
power.power_name,
power.request_url,
permission.parent_id,
permission.power_code,
permission.power_name,
permission.request_url,
rp.role_id,
role.role_code,
role.description
FROM sys_role_power rp
FROM sys_role_permission rp
LEFT JOIN sys_role role ON rp.role_id = role.id
LEFT JOIN sys_power power ON rp.power_id = power.id
LEFT JOIN sys_permission permission ON rp.power_id = permission.id
</select>
</mapper>

View File

@ -8,13 +8,9 @@
<result column="parent_id" property="parentId"/>
<result column="path" property="path"/>
<result column="component" property="component"/>
<result column="frame_src" property="frameSrc"/>
<result column="route_name" property="routeName"/>
<result column="title" property="title"/>
<result column="menu_type" property="menuType"/>
<result column="icon" property="icon"/>
<result column="router_rank" property="routerRank"/>
<result column="visible" property="visible"/>
<result column="meta" property="meta"/>
<result column="create_user" property="createUser"/>
<result column="update_user" property="updateUser"/>
<result column="update_time" property="updateTime"/>
@ -24,7 +20,7 @@
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, parent_id, path, component, frame_src, route_name, title, menu_type, icon, router_rank, visible, create_user, update_user, update_time, create_time, is_deleted
id, parent_id, path, component, route_name, menu_type, meta, create_user, update_user, update_time, create_time, is_deleted
</sql>
<!-- 物理删除路由菜单 -->
@ -37,58 +33,8 @@
</foreach>
</delete>
<!-- 根据用户ID查找路由列表 -->
<select id="selectListByUserId" resultType="java.lang.Long">
SELECT router.id
FROM sys_user_role user_role
LEFT JOIN sys_user user ON user_role.user_id = user.id
LEFT JOIN sys_router_role router_role ON user_role.role_id = router_role.role_id
LEFT JOIN sys_router router ON router_role.router_id = router.id
WHERE user.is_deleted = 0
AND user.id = #{userId}
</select>
<!-- 递归查询所有父级Id直到查询到父级Id为0 -->
<select id="selectParentListByRouterId" resultType="cn.bunny.domain.system.entity.Router">
WITH RECURSIVE ParentChain AS (
SELECT * FROM sys_router
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
UNION ALL
SELECT r.* FROM sys_router r
INNER JOIN ParentChain pc ON r.id = pc.parent_id
)
SELECT
<include refid="Base_Column_List"/>
FROM ParentChain;
</select>
<!-- 管理菜单列表 -->
<select id="selectListByPage" resultType="cn.bunny.domain.system.vo.router.RouterManageVo">
select
router.*,
create_user.username as create_username,
update_user.username as update_username
from sys_router router
left join sys_user create_user on create_user.id = router.create_user
left join sys_user update_user on update_user.id = router.update_user
<where>
role.is_deleted = 0
<if test="dto.title != null and dto.title != ''">
and router.title like CONCAT('%',#{dto.title},'%')
</if>
<if test="dto.visible != null">
and router.visible = #{dto.visible}
</if>
</where>
</select>
<!-- 管理菜单列表不分页 -->
<select id="selectAllList" resultType="cn.bunny.domain.system.vo.router.RouterManageVo">
select
router.*,
<select id="selectMenuList" resultType="cn.bunny.domain.system.vo.router.RouterVo">
select router.*,
create_user.username as create_username,
update_user.username as update_username
from sys_router router
@ -96,12 +42,6 @@
left join sys_user update_user on update_user.id = router.update_user
<where>
router.is_deleted = 0
<if test="dto.title != null and dto.title != ''">
and router.title like CONCAT('%',#{dto.title},'%')
</if>
<if test="dto.visible != null">
and router.visible = #{dto.visible}
</if>
</where>
</select>
</mapper>

View File

@ -24,7 +24,7 @@
delete
from sys_router_role
where router_id in
<foreach collection="routerIds" item="id" open="(" close=")" separator=",">
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
@ -50,18 +50,15 @@
</delete>
<!-- 查看所有路由的角色 -->
<select id="viewRouterRolesWithAll" resultType="cn.bunny.domain.views.ViewRouterRole">
<select id="selectRouterRoleList" resultType="cn.bunny.domain.system.views.ViewRouterRole">
SELECT rr.router_id,
router.parent_id,
router.path,
router.component,
router.frame_src,
router.redirect,
router.route_name,
router.title,
router.menu_type,
router.icon,
router.router_rank,
router.visible,
router.meta,
rr.role_id,
role.role_code,
role.description

View File

@ -29,7 +29,7 @@
</sql>
<!-- 分页查询用户信息内容 -->
<select id="selectListByPage" resultType="cn.bunny.domain.views.ViewUserDept">
<select id="selectListByPage" resultType="cn.bunny.domain.system.views.ViewUserDept">
select
user.*,
user_dept.dept_id,

View File

@ -6,13 +6,13 @@ import cn.bunny.domain.log.entity.ScheduleExecuteLog;
import cn.bunny.domain.model.quartz.ScheduleExecuteLogJson;
import cn.bunny.services.mapper.log.ScheduleExecuteLogMapper;
import com.alibaba.fastjson2.JSON;
import jakarta.annotation.Resource;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.Duration;
@ -26,7 +26,7 @@ public class JobExecuteAspect {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(LocalDateTimeConstant.YYYY_MM_DD_HH_MM_SS);
@Autowired
@Resource
private ScheduleExecuteLogMapper scheduleExecuteLogMapper;
@Around(value = "pointCut()")

View File

@ -8,7 +8,6 @@ import cn.bunny.services.service.configuration.I18nService;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@ -73,7 +72,5 @@ public class I18nExcelListener implements ReadListener<I18nExcel> {
throw new AuthCustomerException(ResultCodeEnum.DATA_TOO_LARGE);
}
i18nService.saveBatch(i18nList);
System.out.println(JSON.toJSONString(i18nList));
}
}

View File

@ -27,7 +27,7 @@ public interface MenuIconService extends IService<MenuIcon> {
*
* @return 系统菜单图标返回列表
*/
PageResult<MenuIconVo> getMenuIconList(Page<MenuIcon> pageParams, MenuIconDto dto);
PageResult<MenuIconVo> menuIconList(Page<MenuIcon> pageParams, MenuIconDto dto);
/**
* * 添加系统菜单图标

View File

@ -203,7 +203,6 @@ public class I18nServiceImpl extends ServiceImpl<I18nMapper, I18n> implements I1
// 判断是否有这个语言的key
List<I18nType> i18nTypeList = i18nTypeMapper.selectList(Wrappers.<I18nType>lambdaQuery().eq(I18nType::getTypeName, type));
if (i18nTypeList.isEmpty() && !file.isEmpty()) throw new AuthCustomerException(ResultCodeEnum.DATA_NOT_EXIST);
try {
// 内容是否为空
String content = new String(file.getBytes());

View File

@ -43,7 +43,7 @@ public class MenuIconServiceImpl extends ServiceImpl<MenuIconMapper, MenuIcon> i
* @return 查询分页系统菜单图标返回对象
*/
@Override
public PageResult<MenuIconVo> getMenuIconList(Page<MenuIcon> pageParams, MenuIconDto dto) {
public PageResult<MenuIconVo> menuIconList(Page<MenuIcon> pageParams, MenuIconDto dto) {
// 分页查询菜单图标
IPage<MenuIconVo> page = baseMapper.selectListByPage(pageParams, dto);
return PageResult.<MenuIconVo>builder()

View File

@ -1,10 +1,10 @@
package cn.bunny.services.service.system;
import cn.bunny.domain.system.entity.Power;
import cn.bunny.domain.system.dto.power.PowerAddDto;
import cn.bunny.domain.system.dto.power.PowerDto;
import cn.bunny.domain.system.dto.power.PowerUpdateBatchByParentIdDto;
import cn.bunny.domain.system.dto.power.PowerUpdateDto;
import cn.bunny.domain.system.entity.Permission;
import cn.bunny.domain.system.vo.PowerVo;
import cn.bunny.domain.vo.result.PageResult;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -21,14 +21,14 @@ import java.util.List;
* @author Bunny
* @since 2024-10-03 16:00:52
*/
public interface PowerService extends IService<Power> {
public interface PowerService extends IService<Permission> {
/**
* * 获取权限列表
*
* @return 权限返回列表
*/
PageResult<PowerVo> getPowerList(Page<Power> pageParams, PowerDto dto);
PageResult<PowerVo> getPowerList(Page<Permission> pageParams, PowerDto dto);
/**
* * 添加权限

View File

@ -1,7 +1,7 @@
package cn.bunny.services.service.system;
import cn.bunny.domain.system.entity.RolePower;
import cn.bunny.domain.system.dto.AssignPowersToRoleDto;
import cn.bunny.domain.system.entity.RolePermission;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.Valid;
@ -15,7 +15,7 @@ import java.util.List;
* @author Bunny
* @since 2024-09-26
*/
public interface RolePowerService extends IService<RolePower> {
public interface RolePowerService extends IService<RolePermission> {
/**
* * 根据角色id获取权限内容

View File

@ -1,7 +1,6 @@
package cn.bunny.services.service.system;
import cn.bunny.domain.system.entity.RouterRole;
import cn.bunny.domain.system.dto.router.AssignRolesToRoutersDto;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
@ -24,24 +23,10 @@ public interface RouterRoleService extends IService<RouterRole> {
*/
List<String> getRoleListByRouterId(Long routerId);
/**
* * 为菜单分配角色
*
* @param dto 路由分配角色
*/
void assignRolesToRouter(AssignRolesToRoutersDto dto);
/**
* 清除选中菜单所有角色
*
* @param routerIds 路由id
*/
void clearAllRolesSelect(List<Long> routerIds);
/**
* 批量为菜单添加角色
*
* @param dto 路由分配角色
*/
void assignAddBatchRolesToRouter(AssignRolesToRoutersDto dto);
}

View File

@ -1,14 +1,10 @@
package cn.bunny.services.service.system;
import cn.bunny.domain.system.entity.Router;
import cn.bunny.domain.system.dto.router.RouterAddDto;
import cn.bunny.domain.system.dto.router.RouterManageDto;
import cn.bunny.domain.system.dto.router.RouterUpdateByIdWithRankDto;
import cn.bunny.domain.system.dto.router.RouterUpdateDto;
import cn.bunny.domain.system.entity.Router;
import cn.bunny.domain.system.vo.router.RouterManageVo;
import cn.bunny.domain.system.vo.router.UserRouterVo;
import cn.bunny.domain.vo.result.PageResult;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import cn.bunny.domain.system.vo.router.WebUserRouterVo;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.Valid;
@ -28,23 +24,14 @@ public interface RouterService extends IService<Router> {
*
* @return 路遇列表
*/
List<UserRouterVo> getRouterAsync();
/**
* * 管理菜单列表
*
* @param pageParams 分页想去
* @param dto 路由查询表单
* @return 系统菜单表分页
*/
PageResult<RouterManageVo> getMenusByPage(Page<Router> pageParams, RouterManageDto dto);
List<WebUserRouterVo> routerAsync();
/**
* * 管理菜单列表
*
* @return 系统菜单表
*/
List<RouterManageVo> getMenusList(RouterManageDto dto);
List<RouterManageVo> menuList();
/**
* * 添加路由菜单
@ -66,11 +53,4 @@ public interface RouterService extends IService<Router> {
* @param ids 删除id列表
*/
void deletedMenuByIds(List<Long> ids);
/**
* * 快速更新菜单排序
*
* @param dto 根据菜单Id更新菜单排序
*/
void updateMenuByIdWithRank(RouterUpdateByIdWithRankDto dto);
}

View File

@ -4,13 +4,13 @@ import cn.bunny.domain.system.dto.power.PowerAddDto;
import cn.bunny.domain.system.dto.power.PowerDto;
import cn.bunny.domain.system.dto.power.PowerUpdateBatchByParentIdDto;
import cn.bunny.domain.system.dto.power.PowerUpdateDto;
import cn.bunny.domain.system.entity.Power;
import cn.bunny.domain.system.entity.Permission;
import cn.bunny.domain.system.vo.PowerVo;
import cn.bunny.domain.vo.result.PageResult;
import cn.bunny.domain.vo.result.ResultCodeEnum;
import cn.bunny.services.exception.AuthCustomerException;
import cn.bunny.services.mapper.system.PowerMapper;
import cn.bunny.services.mapper.system.RolePowerMapper;
import cn.bunny.services.mapper.system.RolePermissionMapper;
import cn.bunny.services.service.system.PowerService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -37,10 +37,10 @@ import java.util.List;
*/
@Service
@Transactional
public class PowerServiceImpl extends ServiceImpl<PowerMapper, Power> implements PowerService {
public class PowerServiceImpl extends ServiceImpl<PowerMapper, Permission> implements PowerService {
@Resource
private RolePowerMapper rolePowerMapper;
private RolePermissionMapper rolePermissionMapper;
/**
* * 权限 服务实现类
@ -50,7 +50,7 @@ public class PowerServiceImpl extends ServiceImpl<PowerMapper, Power> implements
* @return 查询分页权限返回对象
*/
@Override
public PageResult<PowerVo> getPowerList(Page<Power> pageParams, PowerDto dto) {
public PageResult<PowerVo> getPowerList(Page<Permission> pageParams, PowerDto dto) {
IPage<PowerVo> page = baseMapper.selectListByPage(pageParams, dto);
return PageResult.<PowerVo>builder()
@ -69,8 +69,8 @@ public class PowerServiceImpl extends ServiceImpl<PowerMapper, Power> implements
@Override
@Cacheable(cacheNames = "power", key = "'allPower'", cacheManager = "cacheManagerWithMouth")
public List<PowerVo> getAllPowers() {
List<Power> powerList = list();
return powerList.stream().map(power -> {
List<Permission> permissionList = list();
return permissionList.stream().map(power -> {
PowerVo powerVo = new PowerVo();
BeanUtils.copyProperties(power, powerVo);
return powerVo;
@ -86,17 +86,17 @@ public class PowerServiceImpl extends ServiceImpl<PowerMapper, Power> implements
@CacheEvict(cacheNames = "power", key = "'allPower'", beforeInvocation = true)
public void addPower(@Valid PowerAddDto dto) {
// 添加权限时确保权限码和请求地址是唯一的
LambdaQueryWrapper<Power> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Power::getPowerCode, dto.getPowerCode())
LambdaQueryWrapper<Permission> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Permission::getPowerCode, dto.getPowerCode())
.or()
.eq(Power::getRequestUrl, dto.getRequestUrl());
List<Power> powerList = list(wrapper);
if (!powerList.isEmpty()) throw new AuthCustomerException(ResultCodeEnum.DATA_EXIST);
.eq(Permission::getRequestUrl, dto.getRequestUrl());
List<Permission> permissionList = list(wrapper);
if (!permissionList.isEmpty()) throw new AuthCustomerException(ResultCodeEnum.DATA_EXIST);
// 保存数据
Power power = new Power();
BeanUtils.copyProperties(dto, power);
save(power);
Permission permission = new Permission();
BeanUtils.copyProperties(dto, permission);
save(permission);
}
/**
@ -108,14 +108,14 @@ public class PowerServiceImpl extends ServiceImpl<PowerMapper, Power> implements
@CacheEvict(cacheNames = "power", key = "'allPower'", beforeInvocation = true)
public void updatePower(@Valid PowerUpdateDto dto) {
Long id = dto.getId();
List<Power> powerList = list(Wrappers.<Power>lambdaQuery().eq(Power::getId, id));
if (powerList.isEmpty()) throw new AuthCustomerException(ResultCodeEnum.DATA_NOT_EXIST);
List<Permission> permissionList = list(Wrappers.<Permission>lambdaQuery().eq(Permission::getId, id));
if (permissionList.isEmpty()) throw new AuthCustomerException(ResultCodeEnum.DATA_NOT_EXIST);
if (dto.getId().equals(dto.getParentId())) throw new AuthCustomerException(ResultCodeEnum.ILLEGAL_DATA_REQUEST);
// 更新内容
Power power = new Power();
BeanUtils.copyProperties(dto, power);
updateById(power);
Permission permission = new Permission();
BeanUtils.copyProperties(dto, permission);
updateById(permission);
}
/**
@ -133,7 +133,7 @@ public class PowerServiceImpl extends ServiceImpl<PowerMapper, Power> implements
baseMapper.deleteBatchIdsWithPhysics(ids);
// 删除角色部门相关
rolePowerMapper.deleteBatchPowerIdsWithPhysics(ids);
rolePermissionMapper.deleteBatchPowerIdsWithPhysics(ids);
}
/**
@ -144,13 +144,13 @@ public class PowerServiceImpl extends ServiceImpl<PowerMapper, Power> implements
@Override
@CacheEvict(cacheNames = "power", key = "'allPower'", beforeInvocation = true)
public void updateBatchByPowerWithParentId(PowerUpdateBatchByParentIdDto dto) {
List<Power> powerList = dto.getIds().stream().map(id -> {
Power power = new Power();
power.setId(id);
power.setParentId(dto.getParentId());
return power;
List<Permission> permissionList = dto.getIds().stream().map(id -> {
Permission permission = new Permission();
permission.setId(id);
permission.setParentId(dto.getParentId());
return permission;
}).toList();
updateBatchById(powerList);
updateBatchById(permissionList);
}
}

View File

@ -2,9 +2,9 @@ package cn.bunny.services.service.system.impl;
import cn.bunny.domain.system.dto.AssignPowersToRoleDto;
import cn.bunny.domain.system.entity.AdminUser;
import cn.bunny.domain.system.entity.RolePower;
import cn.bunny.domain.system.entity.RolePermission;
import cn.bunny.domain.system.entity.UserRole;
import cn.bunny.services.mapper.system.RolePowerMapper;
import cn.bunny.services.mapper.system.RolePermissionMapper;
import cn.bunny.services.mapper.system.UserMapper;
import cn.bunny.services.mapper.system.UserRoleMapper;
import cn.bunny.services.service.system.RolePowerService;
@ -27,7 +27,7 @@ import java.util.List;
*/
@Service
@Transactional
public class RolePowerServiceImpl extends ServiceImpl<RolePowerMapper, RolePower> implements RolePowerService {
public class RolePowerServiceImpl extends ServiceImpl<RolePermissionMapper, RolePermission> implements RolePowerService {
@Resource
private UserMapper userMapper;
@ -46,8 +46,8 @@ public class RolePowerServiceImpl extends ServiceImpl<RolePowerMapper, RolePower
*/
@Override
public List<String> getPowerListByRoleId(Long id) {
List<RolePower> rolePowerList = baseMapper.selectPowerListByRoleId(id);
return rolePowerList.stream().map(rolePower -> rolePower.getPowerId().toString()).toList();
List<RolePermission> rolePermissionList = baseMapper.selectPowerListByRoleId(id);
return rolePermissionList.stream().map(rolePermission -> rolePermission.getPowerId().toString()).toList();
}
/**
@ -64,13 +64,13 @@ public class RolePowerServiceImpl extends ServiceImpl<RolePowerMapper, RolePower
baseMapper.deleteBatchRoleIdsWithPhysics(List.of(roleId));
// 保存分配数据
List<RolePower> rolePowerList = powerIds.stream().map(powerId -> {
RolePower rolePower = new RolePower();
rolePower.setRoleId(roleId);
rolePower.setPowerId(powerId);
return rolePower;
List<RolePermission> rolePermissionList = powerIds.stream().map(powerId -> {
RolePermission rolePermission = new RolePermission();
rolePermission.setRoleId(roleId);
rolePermission.setPowerId(powerId);
return rolePermission;
}).toList();
saveBatch(rolePowerList);
saveBatch(rolePermissionList);
// 找到所有和当前更新角色相同的用户
List<Long> roleIds = userRoleMapper.selectList(Wrappers.<UserRole>lambdaQuery().eq(UserRole::getRoleId, roleId))

View File

@ -10,7 +10,7 @@ import cn.bunny.domain.vo.result.PageResult;
import cn.bunny.domain.vo.result.ResultCodeEnum;
import cn.bunny.services.exception.AuthCustomerException;
import cn.bunny.services.mapper.system.RoleMapper;
import cn.bunny.services.mapper.system.RolePowerMapper;
import cn.bunny.services.mapper.system.RolePermissionMapper;
import cn.bunny.services.mapper.system.RouterRoleMapper;
import cn.bunny.services.mapper.system.UserRoleMapper;
import cn.bunny.services.service.system.RoleService;
@ -43,7 +43,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
private UserRoleMapper userRoleMapper;
@Resource
private RolePowerMapper rolePowerMapper;
private RolePermissionMapper rolePermissionMapper;
@Resource
private RouterRoleMapper routerRoleMapper;
@ -137,7 +137,7 @@ public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements Ro
baseMapper.deleteBatchIdsWithPhysics(ids);
// 删除角色权限相关
rolePowerMapper.deleteBatchRoleIdsWithPhysics(ids);
rolePermissionMapper.deleteBatchRoleIdsWithPhysics(ids);
// 删除角色和用户相关
userRoleMapper.deleteBatchIdsByRoleIdsWithPhysics(ids);

View File

@ -1,18 +1,15 @@
package cn.bunny.services.service.system.impl;
import cn.bunny.domain.system.entity.RouterRole;
import cn.bunny.domain.system.dto.router.AssignRolesToRoutersDto;
import cn.bunny.domain.vo.result.ResultCodeEnum;
import cn.bunny.services.exception.AuthCustomerException;
import cn.bunny.services.mapper.system.RouterRoleMapper;
import cn.bunny.services.service.system.RouterRoleService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
@ -39,35 +36,6 @@ public class RouterRoleServiceImpl extends ServiceImpl<RouterRoleMapper, RouterR
.map(routerRole -> routerRole.getRoleId().toString()).toList();
}
/**
* * 为菜单分配角色
*
* @param dto 路由分配角色
*/
@Override
public void assignRolesToRouter(AssignRolesToRoutersDto dto) {
List<Long> routerIds = dto.getRouterIds();
List<Long> roleIds = dto.getRoleIds();
// 删除这个路由下所有已经分配好的角色内容
baseMapper.deleteBatchIdsByRouterIdsWithPhysics(routerIds);
// 保存分配好的角色信息
List<RouterRole> roleList = new ArrayList<>();
for (Long roleId : roleIds) {
List<RouterRole> list = routerIds.stream().map(routerId -> {
RouterRole routerRole = new RouterRole();
routerRole.setRouterId(routerId);
routerRole.setRoleId(roleId);
return routerRole;
}).toList();
roleList.addAll(list);
}
saveBatch(roleList);
}
/**
* 清除选中菜单所有角色
*
@ -80,42 +48,5 @@ public class RouterRoleServiceImpl extends ServiceImpl<RouterRoleMapper, RouterR
}
baseMapper.deleteBatchIdsByRouterIdsWithPhysics(routerIds);
}
/**
* 批量为菜单添加角色
* 查询所有满足角色id列表的路由
* 将满足条件的路由提取出routerId列表
* 并删除所有routerIds
*
* @param dto 路由分配角色
*/
@Override
public void assignAddBatchRolesToRouter(AssignRolesToRoutersDto dto) {
// 查询所有满足角色id和路由Id相关
LambdaQueryWrapper<RouterRole> wrapper = new LambdaQueryWrapper<>();
wrapper.in(RouterRole::getRoleId, dto.getRoleIds())
.and(qw -> qw.in(RouterRole::getRouterId, dto.getRouterIds()));
List<RouterRole> routerRoleList = list(wrapper);
// 根据Id列表物理删除路由角色关系表
List<Long> ids = routerRoleList.stream().map(RouterRole::getId).toList();
if (!ids.isEmpty()) {
baseMapper.deleteBatchIdsWithPhysics(ids);
}
// 保存分配好的角色信息
List<RouterRole> roleList = new ArrayList<>();
for (Long roleId : dto.getRoleIds()) {
List<RouterRole> list = dto.getRouterIds().stream().map(routerId -> {
RouterRole routerRole = new RouterRole();
routerRole.setRouterId(routerId);
routerRole.setRoleId(roleId);
return routerRole;
}).toList();
roleList.addAll(list);
}
saveBatch(roleList);
}
}

View File

@ -1,37 +1,35 @@
package cn.bunny.services.service.system.impl;
import cn.bunny.domain.system.dto.router.RouterAddDto;
import cn.bunny.domain.system.dto.router.RouterManageDto;
import cn.bunny.domain.system.dto.router.RouterUpdateByIdWithRankDto;
import cn.bunny.domain.system.dto.router.RouterUpdateDto;
import cn.bunny.domain.system.entity.Role;
import cn.bunny.domain.system.entity.Router;
import cn.bunny.domain.system.entity.RouterMeta;
import cn.bunny.domain.system.entity.RouterMetaTransition;
import cn.bunny.domain.system.views.ViewRolePermission;
import cn.bunny.domain.system.views.ViewRouterRole;
import cn.bunny.domain.system.vo.router.RouterManageVo;
import cn.bunny.domain.system.vo.router.RouterMeta;
import cn.bunny.domain.system.vo.router.UserRouterVo;
import cn.bunny.domain.views.ViewRolePower;
import cn.bunny.domain.views.ViewRouterRole;
import cn.bunny.domain.vo.result.PageResult;
import cn.bunny.domain.system.vo.router.RouterVo;
import cn.bunny.domain.system.vo.router.WebUserRouterVo;
import cn.bunny.domain.vo.result.ResultCodeEnum;
import cn.bunny.services.context.BaseContext;
import cn.bunny.services.exception.AuthCustomerException;
import cn.bunny.services.mapper.system.RoleMapper;
import cn.bunny.services.mapper.system.RolePowerMapper;
import cn.bunny.services.mapper.system.RolePermissionMapper;
import cn.bunny.services.mapper.system.RouterMapper;
import cn.bunny.services.mapper.system.RouterRoleMapper;
import cn.bunny.services.service.system.RouterService;
import cn.bunny.services.utils.system.RoleUtil;
import cn.bunny.services.utils.system.RouterServiceUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cn.bunny.services.utils.system.RouterUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -45,154 +43,84 @@ import java.util.stream.Collectors;
@Service
@Transactional
public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> implements RouterService {
@Resource
private RouterServiceUtil routerServiceUtil;
@Resource
private RoleMapper roleMapper;
@Resource
private RouterRoleMapper routerRoleMapper;
@Resource
private RolePowerMapper rolePowerMapper;
private RouterUtil routerUtil;
@Resource
private RolePermissionMapper rolePermissionMapper;
/**
* * 获取路由内容
* 获取路由内容
*
* @return 路遇列表
*/
@Override
public List<UserRouterVo> getRouterAsync() {
// 根据用户ID查询角色数据
Long userId = BaseContext.getUserId();
// 查询角色信息
List<Role> roleList;
List<String> userRoleCodeList;
if (userId.equals(1L)) {
userRoleCodeList = List.of("admin");
} else {
roleList = roleMapper.selectListByUserId(userId);
userRoleCodeList = roleList.stream().map(Role::getRoleCode).toList();
}
// 如果没有分配角色直接返回空数组
if (userRoleCodeList.isEmpty()) return new ArrayList<>();
public List<WebUserRouterVo> routerAsync() {
// 返回路由列表
List<UserRouterVo> list = new ArrayList<>();
List<WebUserRouterVo> voList = new ArrayList<>();
// 查询用户角色判断是否是管理员角色
boolean isAdmin = RoleUtil.checkAdmin(userRoleCodeList);
// 查询路由和角色对应关系
List<ViewRouterRole> routerRoleList = routerRoleMapper.viewRouterRolesWithAll();
Map<Long, List<String>> routerIdWithRoleCodeMap = routerRoleList.stream()
.collect(Collectors.groupingBy(
ViewRouterRole::getRouterId,
Collectors.mapping(ViewRouterRole::getRoleCode, Collectors.toUnmodifiableList())
));
// 角色和权限对应关系
List<ViewRolePower> rolePowerList = rolePowerMapper.viewRolePowerWithAll();
Map<String, Set<String>> roleCodeWithPowerCodeMap = rolePowerList.stream()
.collect(Collectors.groupingBy(
ViewRolePower::getRoleCode,
Collectors.mapping(ViewRolePower::getPowerCode, Collectors.toUnmodifiableSet())
));
// 查询所有路由内容
// 当前的所有的路由列表
List<Router> routerList = list();
// 构建返回路由列表
List<UserRouterVo> routerVoList = routerList.stream()
.sorted(Comparator.comparing(Router::getRouterRank))
.filter(Router::getVisible)
.map(router -> {
// 角色码列表
List<String> roleCodeList;
// 查询路由角色列表
Map<Long, List<ViewRouterRole>> routerRoleList = routerRoleMapper.selectRouterRoleList().stream()
.collect(Collectors.groupingBy(ViewRouterRole::getRouterId, Collectors.toList()));
// 权限码列表
List<String> powerCodeList;
// 查询角色和权限列表根据角色id获取对应权限
Map<Long, List<ViewRolePermission>> rolePermissionList = rolePermissionMapper.viewRolePowerWithAll().stream()
.collect(Collectors.groupingBy(ViewRolePermission::getRoleId, Collectors.toList()));
// 判断是否是admin
if (isAdmin) {
roleCodeList = userRoleCodeList;
powerCodeList = List.of("*", "*::*", "*::*::*");
} else {
roleCodeList = routerIdWithRoleCodeMap.getOrDefault(router.getId(), Collections.emptyList());
powerCodeList = roleCodeList.stream()
.map(roleCodeWithPowerCodeMap::get)
.filter(Objects::nonNull)
.flatMap(Set::stream)
.collect(Collectors.toUnmodifiableSet())
.stream().toList();
}
// 整理web用户所能看到的路由列表
List<WebUserRouterVo> webUserRouterVoList = routerUtil.getWebUserRouterVos(routerList, routerRoleList, rolePermissionList);
// 复制对象
UserRouterVo routerVo = new UserRouterVo();
BeanUtils.copyProperties(router, routerVo);
// 设置
RouterMeta meta = RouterMeta.builder()
.frameSrc(router.getFrameSrc())
.rank(router.getRouterRank())
.icon(router.getIcon())
.title(router.getTitle())
.roles(roleCodeList)
.auths(powerCodeList)
.build();
routerVo.setMeta(meta);
return routerVo;
}).distinct().toList();
// 构建树形结构
routerVoList.forEach(routerVo -> {
// 添加 admin 管理路由权限
webUserRouterVoList.forEach(routerVo -> {
// 递归添加路由节点
if (routerVo.getParentId() == 0) {
routerVo.setChildren(routerServiceUtil.handleGetChildrenWIthRouter(routerVo.getId(), routerVoList));
list.add(routerVo);
routerVo.setChildren(routerUtil.handleGetChildrenWIthRouter(routerVo.getId(), webUserRouterVoList));
voList.add(routerVo);
}
});
return list;
return voList;
}
/**
* * 管理菜单列表
*
* @param pageParams 分页想去
* @param dto 路由查询表单
* @return 系统菜单表分页
*/
@Override
public PageResult<RouterManageVo> getMenusByPage(Page<Router> pageParams, RouterManageDto dto) {
IPage<RouterManageVo> page = baseMapper.selectListByPage(pageParams, dto);
// 构建返回对象
List<RouterManageVo> voList = page.getRecords().stream()
.sorted(Comparator.comparing(RouterManageVo::getRouterRank))
.toList();
return PageResult.<RouterManageVo>builder()
.list(voList)
.pageNo(page.getCurrent())
.pageSize(page.getSize())
.total(page.getTotal())
.build();
}
/**
* * 管理菜单列表
* 管理菜单列表
*
* @return 系统菜单表
*/
@Override
public List<RouterManageVo> getMenusList(RouterManageDto dto) {
List<RouterManageVo> list = baseMapper.selectAllList(dto);
return list.stream()
.sorted(Comparator.comparing(RouterManageVo::getRouterRank))
public List<RouterManageVo> menuList() {
// 查询菜单路由
List<RouterVo> routerList = baseMapper.selectMenuList();
return routerList.stream().map(router -> {
// 管理路由
RouterManageVo routerManageVo = new RouterManageVo();
BeanUtils.copyProperties(router, routerManageVo);
// 将字符串JSON转成实体类需要判断 meta和transition 是否存在
String meta = router.getMeta();
if (StringUtils.hasText(meta)) {
// 路由 Meta
RouterMeta routerMeta = JSON.parseObject(meta, RouterMeta.class);
BeanUtils.copyProperties(routerMeta, routerManageVo);
// 路由动画
RouterMetaTransition transition = routerMeta.getTransition();
if (transition != null) {
BeanUtils.copyProperties(transition, routerManageVo);
}
}
return routerManageVo;
})
.sorted(Comparator.comparing(RouterManageVo::getRank))
.toList();
}
@ -207,9 +135,20 @@ public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> impleme
Router router = new Router();
BeanUtils.copyProperties(dto, router);
// meta转成json
RouterMeta meta = dto.getMeta();
String jsonString = JSON.toJSONString(meta);
router.setMeta(jsonString);
// 将数据提出role power 存储到数据库
Long id = router.getId();
routerUtil.insertRouterRoleAndPermission(meta, id);
// 添加路由
save(router);
}
/**
* * 更新路由菜单
*
@ -217,19 +156,23 @@ public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> impleme
*/
@Override
public void updateMenu(RouterUpdateDto dto) {
// 查询当前路由和父级路由
Router routerParent = getOne(Wrappers.<Router>lambdaQuery().eq(Router::getId, dto.getParentId()));
// 设置路由等级需要大于或等于父级的路由等级
if (routerParent != null && (dto.getRouterRank() < routerParent.getRouterRank())) {
throw new AuthCustomerException(ResultCodeEnum.ROUTER_RANK_NEED_LARGER_THAN_THE_PARENT);
}
// 如果设置的不是外部页面
if (!dto.getMenuType().equals(2)) dto.setFrameSrc("");
// 更新路由
Router router = new Router();
BeanUtils.copyProperties(dto, router);
// 将前端meta转成JSON 存储到数据库
RouterMeta meta = dto.getMeta();
String jsonString = JSON.toJSONString(meta);
router.setMeta(jsonString);
Long id = router.getId();
// 先删除路由和角色下所有内容
routerRoleMapper.deleteBatchIdsByRouterIdsWithPhysics(List.of(id));
// 将数据提出role power 存储到数据库
routerUtil.insertRouterRoleAndPermission(meta, id);
// 更新路由信息
updateById(router);
}
@ -253,31 +196,4 @@ public class RouterServiceImpl extends ServiceImpl<RouterMapper, Router> impleme
// // 物理删除
// baseMapper.deleteBatchIdsWithPhysics(ids);
}
/**
* * 快速更新菜单排序
*
* @param dto 根据菜单Id更新菜单排序
*/
@Override
public void updateMenuByIdWithRank(RouterUpdateByIdWithRankDto dto) {
Router router = getOne(Wrappers.<Router>lambdaQuery().eq(Router::getId, dto.getId()));
// 判断更新数据是否存在
if (router == null) throw new AuthCustomerException(ResultCodeEnum.DATA_NOT_EXIST);
// 查询当前路由和父级路由
Router routerParent = getOne(Wrappers.<Router>lambdaQuery().eq(Router::getId, router.getParentId()));
// 设置路由等级需要大于或等于父级的路由等级
if (routerParent != null && (dto.getRouterRank() < routerParent.getRouterRank())) {
throw new AuthCustomerException(ResultCodeEnum.ROUTER_RANK_NEED_LARGER_THAN_THE_PARENT);
}
// 更新排序
router = new Router();
router.setId(dto.getId());
router.setRouterRank(dto.getRouterRank());
updateById(router);
}
}

View File

@ -12,11 +12,11 @@ import cn.bunny.domain.system.dto.user.*;
import cn.bunny.domain.system.entity.AdminUser;
import cn.bunny.domain.system.entity.Role;
import cn.bunny.domain.system.entity.UserDept;
import cn.bunny.domain.system.views.ViewUserDept;
import cn.bunny.domain.system.vo.user.AdminUserVo;
import cn.bunny.domain.system.vo.user.RefreshTokenVo;
import cn.bunny.domain.system.vo.user.SearchUserinfoVo;
import cn.bunny.domain.system.vo.user.UserVo;
import cn.bunny.domain.views.ViewUserDept;
import cn.bunny.domain.vo.LoginVo;
import cn.bunny.domain.vo.result.PageResult;
import cn.bunny.domain.vo.result.ResultCodeEnum;
@ -102,7 +102,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, AdminUser> implemen
@Resource
private UserMapper userMapper;
@Resource
private PasswordEncoder passwordEncoder;

View File

@ -1,31 +0,0 @@
package cn.bunny.services.utils.system;
import cn.bunny.domain.system.vo.router.UserRouterVo;
import org.jetbrains.annotations.NotNull;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class RouterServiceUtil {
/**
* * 递归调用设置子路由
*
* @param id 主键
* @param routerVoList 返回VO列表
* @return 返回路由列表
*/
public List<UserRouterVo> handleGetChildrenWIthRouter(Long id, @NotNull List<UserRouterVo> routerVoList) {
List<UserRouterVo> list = new ArrayList<>();
for (UserRouterVo routerVo : routerVoList) {
if (routerVo.getParentId().equals(id)) {
routerVo.setChildren(handleGetChildrenWIthRouter(routerVo.getId(), routerVoList));
list.add(routerVo);
}
}
return list;
}
}

View File

@ -0,0 +1,146 @@
package cn.bunny.services.utils.system;
import cn.bunny.domain.system.entity.Router;
import cn.bunny.domain.system.entity.RouterMeta;
import cn.bunny.domain.system.entity.RouterRole;
import cn.bunny.domain.system.views.ViewRolePermission;
import cn.bunny.domain.system.views.ViewRouterRole;
import cn.bunny.domain.system.vo.router.WebUserRouterVo;
import cn.bunny.services.service.system.RouterRoleService;
import com.alibaba.fastjson2.JSON;
import jakarta.annotation.Resource;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static cn.bunny.domain.constant.UserConstant.allAuths;
@Component
public class RouterUtil {
@Resource
private RouterRoleService routerRoleService;
/**
* * 递归调用设置子路由
*
* @param id 主键
* @param webUserRouterVoList 返回VO列表
* @return 返回路由列表
*/
public List<WebUserRouterVo> handleGetChildrenWIthRouter(Long id, @NotNull List<WebUserRouterVo> webUserRouterVoList) {
List<WebUserRouterVo> list = new ArrayList<>();
for (WebUserRouterVo webUserRouterVo : webUserRouterVoList) {
if (webUserRouterVo.getParentId().equals(id)) {
webUserRouterVo.setChildren(handleGetChildrenWIthRouter(webUserRouterVo.getId(), webUserRouterVoList));
list.add(webUserRouterVo);
}
}
return list;
}
/**
* 查询新的路由权限和角色
*
* @param meta RouterMeta
* @param id 路由id
*/
public void insertRouterRoleAndPermission(RouterMeta meta, Long id) {
List<String> roles = meta.getRoles();
// 插入新的角色信息
List<RouterRole> routerRoleList = roles.stream().map(role -> {
RouterRole routerRole = new RouterRole();
routerRole.setRouterId(id);
routerRole.setRoleId(Long.valueOf(role));
return routerRole;
}).toList();
routerRoleService.saveBatch(routerRoleList);
}
/**
* 整理web用户所能看到的路由列表
*
* @param routerList 所有的路由列表
* @param routerRoleList 路由和角色列表
* @param rolePermissionList 角色和权限列表
* @return web用户所能看到的路由列表
*/
@NotNull
public List<WebUserRouterVo> getWebUserRouterVos(List<Router> routerList, Map<Long, List<ViewRouterRole>> routerRoleList, Map<Long, List<ViewRolePermission>> rolePermissionList) {
// 查询路由所有数据整理前端需要的路和角色权限
return routerList.stream().map(view -> {
// 前端需要的格式路由
WebUserRouterVo webUserRouterVo = new WebUserRouterVo();
// 复制数据库中信息到新路由中
BeanUtils.copyProperties(view, webUserRouterVo);
// 整理前端需要格式的路由 meta
String meta = view.getMeta();
RouterMeta routerMeta;
// 如果么meta存在将其转成 RouterMeta 而不是 JSON/字符串
if (StringUtils.hasText(meta)) {
routerMeta = JSON.parseObject(meta, RouterMeta.class);
webUserRouterVo.setMeta(routerMeta);
} else {
// 不存在时不能为 null 将路由名称设置为title
routerMeta = new RouterMeta();
routerMeta.setTitle(view.getRouteName());
webUserRouterVo.setMeta(routerMeta);
}
// 路由路由和橘色 设置角色信息防止为空报错最后添加 roles
List<String> roleCodeList = new ArrayList<>(allAuths);
if (!routerRoleList.isEmpty()) {
// 找到当前路由下的角色信息
List<String> list = routerRoleList.getOrDefault(view.getId(), Collections.emptyList()).stream()
.map(ViewRouterRole::getRoleCode).toList();
// 将角色码添加到角色列表
roleCodeList.addAll(list);
}
webUserRouterVo.getMeta().setRoles(roleCodeList);
// 角色和权限 设置权限信息最后添加权限信息 auth/permission
List<String> permissionList = new ArrayList<>(allAuths);
if (!rolePermissionList.isEmpty()) {
// 找到当前路由下所有的角色id之后根据 角色和权限查找 角色对应的权限
List<Long> roleIds = routerRoleList.getOrDefault(view.getId(), Collections.emptyList()).stream()
.map(ViewRouterRole::getRoleId).toList();
// 根据角色id找到所有权限
List<String> list = roleIds.stream()
.map(roleId -> {
List<ViewRolePermission> viewRolePermissions = rolePermissionList.get(roleId);
// 根据角色id查找权限且角色和权限存在
if (roleId != null && viewRolePermissions != null && !viewRolePermissions.isEmpty()) {
return viewRolePermissions.stream().map(ViewRolePermission::getPowerCode).toList();
}
// 未找到返回 空字符串
return List.of("");
})
// 将二维数组转成一维数组
.flatMap(List::stream)
// 过滤掉为空的字符串
.filter(StringUtils::hasText)
.distinct()
.toList();
permissionList.addAll(list);
}
webUserRouterVo.getMeta().setAuths(permissionList);
return webUserRouterVo;
}).toList();
}
}

View File

@ -5,7 +5,7 @@ import cn.bunny.domain.constant.RedisUserConstant;
import cn.bunny.domain.constant.UserConstant;
import cn.bunny.domain.log.entity.UserLoginLog;
import cn.bunny.domain.system.entity.AdminUser;
import cn.bunny.domain.system.entity.Power;
import cn.bunny.domain.system.entity.Permission;
import cn.bunny.domain.system.entity.Role;
import cn.bunny.domain.vo.LoginVo;
import cn.bunny.services.exception.AuthCustomerException;
@ -123,7 +123,7 @@ public class UserUtil {
// 判断是否是 admin 如果是admin 赋予所有权限
boolean isAdmin = RoleUtil.checkAdmin(roles, permissions, user);
if (!isAdmin) {
permissions = powerMapper.selectListByUserId(userId).stream().map(Power::getPowerCode).toList();
permissions = powerMapper.selectListByUserId(userId).stream().map(Permission::getPowerCode).toList();
}
// 计算过期时间并格式化返回

File diff suppressed because it is too large Load Diff

View File

@ -2,8 +2,11 @@ package cn.bunny.domain.constant;
import lombok.Data;
import java.util.List;
@Data
public class UserConstant {
public static final String USER_AVATAR = "https://thirdwx.qlogo.cn/mmopen/vi_32/DYAIOgq83eoj0hHXhgJNOTSOFsS4uZs8x1ConecaVOB8eIl115xmJZcT4oCicvia7wMEufibKtTLqiaJeanU2Lpg3w/132";
public static final String PERSON_DESCRIPTION = "这个人很懒没有介绍...";
public static final List<String> allAuths = List.of("*::*::*", "*::*", "*");
}

View File

@ -8,11 +8,11 @@ import java.util.Map;
public class VmsUtil {
private static final Map<String, String> TYPE_MAPPINGS = Map.of(
"controller" , "Controller" ,
"service" , "Service" ,
"serviceImpl" , "ServiceImpl" ,
"mapper" , "Mapper" ,
"resourceMapper" , "Mapper"
"controller", "Controller",
"service", "Service",
"serviceImpl", "ServiceImpl",
"mapper", "Mapper",
"resourceMapper", "Mapper"
);
/**
@ -22,20 +22,18 @@ public class VmsUtil {
* @param className 类名
*/
public static String handleVmFilename(String path, String className) {
String[] splitPaths = path.split("/" );
String[] splitPaths = path.split("/");
int splitPathsSize = splitPaths.length - 1;
// 大驼峰名称
String CamelCase = TypeConvertCore.convertToCamelCase(className, true);
// 小驼峰名称
String camelCase = TypeConvertCore.convertToCamelCase(className);
System.out.println("CamelCase" + CamelCase);
System.out.println("camelCase" + camelCase);
// 当前文件名
String filename = splitPaths[splitPathsSize];
filename = filename.replace(".vm" , "" );
filename = filename.replace(".vm", "");
String[] split = filename.split("\\." );
String[] split = filename.split("\\.");
// 文件名称
String name = split[0];
// 文件扩展名
@ -47,15 +45,15 @@ public class VmsUtil {
// 判断是否是 Java 或者 xml 文件
String typeMappingsFilename = TYPE_MAPPINGS.get(name);
typeMappingsFilename = typeMappingsFilename == null ? "" : typeMappingsFilename;
if (filename.contains("java" ) || filename.contains("xml" )) {
if (filename.contains("java") || filename.contains("xml")) {
filename = CamelCase + typeMappingsFilename + "." + extension;
}
if (filename.contains("vue" ) && !filename.contains("index" )) {
if (filename.contains("vue") && !filename.contains("index")) {
filename = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, camelCase) + "-" + name + "." + extension;
}
splitPaths[splitPathsSize] = filename;
return String.join("/" , splitPaths);
return String.join("/", splitPaths);
}
}