页面权限基础功能、树形

This commit is contained in:
attiya 2025-09-05 10:42:51 +08:00
parent 4bd6c4581c
commit 816cb211e4
9 changed files with 331 additions and 28 deletions

View File

@ -2,13 +2,18 @@ package com.cdzy.staff.controller;
import com.cdzy.common.model.request.PageParam;
import com.cdzy.common.model.response.JsonResult;
import com.cdzy.staff.model.dto.EbikePermissionTreeNode;
import com.cdzy.staff.model.entity.EbikePermission;
import com.cdzy.staff.model.vo.EbikePermissionVo;
import com.cdzy.staff.service.EbikePermissionService;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.util.StringUtil;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
/**
* 系统权限表 控制层
@ -30,20 +35,20 @@ public class EbikePermissionController {
* @return {@code true} 添加成功{@code false} 添加失败
*/
@PostMapping("save")
public JsonResult<?> save(@RequestBody EbikePermission ebikePermission) {
ebikePermissionService.save(ebikePermission);
public JsonResult<?> save(@RequestBody EbikePermissionVo ebikePermission) {
ebikePermissionService.savePermission(ebikePermission);
return JsonResult.success();
}
/**
* 根据主键删除系统权限表
*
* @param id 主键
* @param permissionId 主键
* @return {@code true} 删除成功{@code false} 删除失败
*/
@PostMapping("remove/{id}")
public JsonResult<?> remove(@PathVariable Long id) {
ebikePermissionService.removeById(id);
@GetMapping("remove")
public JsonResult<?> remove(@RequestParam("permissionId") Long permissionId) {
ebikePermissionService.removeById(permissionId);
return JsonResult.success();
}
@ -54,8 +59,8 @@ public class EbikePermissionController {
* @return {@code true} 更新成功{@code false} 更新失败
*/
@PostMapping("update")
public JsonResult<?> update(@RequestBody EbikePermission ebikePermission) {
ebikePermissionService.updateById(ebikePermission);
public JsonResult<?> update(@RequestBody EbikePermissionVo ebikePermission) {
ebikePermissionService.updatePermission(ebikePermission);
return JsonResult.success();
}
@ -65,20 +70,22 @@ public class EbikePermissionController {
* @return 所有数据
*/
@GetMapping("list")
public JsonResult<?> list() {
List<EbikePermission> list = ebikePermissionService.list();
public JsonResult<?> list(@RequestParam("type")Integer type) {
QueryWrapper queryWrapper = QueryWrapper.create()
.eq("type", type, Objects.nonNull(type));
List<EbikePermission> list = ebikePermissionService.list(queryWrapper);
return JsonResult.success(list);
}
/**
* 根据系统权限表主键获取详细信息
*
* @param id 系统权限表主键
* @param permissionId 系统权限表主键
* @return 系统权限表详情
*/
@GetMapping("getInfo/{id}")
public JsonResult<?> getInfo(@PathVariable Long id) {
EbikePermission ebikePermission = ebikePermissionService.getById(id);
@GetMapping("getInfo")
public JsonResult<?> getInfo(@RequestParam("permissionId") Long permissionId) {
EbikePermission ebikePermission = ebikePermissionService.getById(permissionId);
return JsonResult.success(ebikePermission);
}
@ -89,9 +96,21 @@ public class EbikePermissionController {
* @return 分页对象
*/
@GetMapping("page")
public JsonResult<?> page(PageParam pageParam) {
Page<EbikePermission> page = ebikePermissionService.page(pageParam.getPage());
public JsonResult<?> page(PageParam pageParam,String name) {
QueryWrapper queryWrapper = QueryWrapper.create().like(EbikePermission::getName,name, StringUtil.hasText(name));
Page<EbikePermission> page = ebikePermissionService.page(pageParam.getPage(),queryWrapper);
return JsonResult.success(page);
}
/**
* 获取所有权限的树形结构
*
* @return 树形结构
*/
@GetMapping("tree")
public JsonResult<?> tree() {
List<EbikePermissionTreeNode> list = ebikePermissionService.tree();
return JsonResult.success(list);
}
}

View File

@ -0,0 +1,82 @@
package com.cdzy.staff.model.dto;
import com.mybatisflex.annotation.Id;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* 系统权限表 实体类
*
* @author loves
* @since 2025-09-04
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EbikePermissionTreeNode implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Id
private Long permissionId;
/**
* 组件路径
*/
private String component;
/**
* 菜单名称
*/
private String name;
/**
* 类型1-目录 2-页面 3-按钮
*/
private Integer type;
private Long createBy;
private LocalDateTime createTime;
private Long updateBy;
private LocalDateTime updateTime;
private Boolean isDeleted;
/**
* 路由路径
*/
private String path;
/**
* 父级id
*/
private Long parentId;
/**
* 图标
*/
private String svgIcon;
/**
* 重定向路径
*/
private String redirect;
/**
* 子集
*/
private List<EbikePermissionTreeNode> children;
}

View File

@ -1,18 +1,16 @@
package com.cdzy.staff.model.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.sql.Timestamp;
import java.io.Serial;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 系统权限表 实体类
*
@ -29,7 +27,7 @@ public class EbikePermission implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Id(keyType = KeyType.Auto)
@Id
private Long permissionId;
/**
@ -49,11 +47,11 @@ public class EbikePermission implements Serializable {
private Long createBy;
private Timestamp createTime;
private LocalDateTime createTime;
private Long updateBy;
private Timestamp updateTime;
private LocalDateTime updateTime;
private Boolean isDeleted;
@ -72,4 +70,9 @@ public class EbikePermission implements Serializable {
*/
private String svgIcon;
/**
* 重定向路径
*/
private String redirect;
}

View File

@ -0,0 +1,72 @@
package com.cdzy.staff.model.vo;
import com.mybatisflex.annotation.Table;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
/**
* 系统权限表 实体类
*
* @author loves
* @since 2025-09-04
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table("ebike_permission")
public class EbikePermissionVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long permissionId;
/**
* 菜单标题
*/
@NotBlank(message = "菜单标题不能为空")
private String name;
/**
* 类型1-目录 2-页面 3-按钮
*/
@NotNull(message = "类型不能为空")
private Integer type;
/**
* 组件路径
*/
@NotBlank(message = "菜单标题不能为空")
private String component;
/**
* 路由路径
*/
@NotBlank(message = "菜单标题不能为空")
private String path;
/**
* 图标
*/
private String svgIcon;
/**
* 重定向路径
*/
private String redirect;
/**
* 父级id
*/
private Long parentId;
}

View File

@ -1,8 +1,12 @@
package com.cdzy.staff.service;
import com.cdzy.staff.model.dto.EbikePermissionTreeNode;
import com.cdzy.staff.model.vo.EbikePermissionVo;
import com.mybatisflex.core.service.IService;
import com.cdzy.staff.model.entity.EbikePermission;
import java.util.List;
/**
* 系统权限表 服务层
*
@ -11,4 +15,13 @@ import com.cdzy.staff.model.entity.EbikePermission;
*/
public interface EbikePermissionService extends IService<EbikePermission> {
void savePermission(EbikePermissionVo ebikePermission);
void updatePermission(EbikePermissionVo ebikePermission);
/**
* 获取树形结构
* @return 树形结构
*/
List<EbikePermissionTreeNode> tree();
}

View File

@ -41,6 +41,7 @@ public class EbikeOperatorServiceImpl extends ServiceImpl<EbikeOperatorMapper, E
operatorOld.setOperatorName(ebikeOperator.getOperatorName());
operatorOld.setAddress(ebikeOperator.getAddress());
operatorOld.setContactPhone(ebikeOperator.getContactPhone());
operatorOld.setUpdateBy(StpUtil.getLoginIdAsLong());
ebikeOperatorMapper.update(operatorOld);
}
}

View File

@ -1,11 +1,20 @@
package com.cdzy.staff.service.impl;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import com.cdzy.staff.model.entity.EbikePermission;
import cn.dev33.satoken.stp.StpUtil;
import com.cdzy.common.ex.EbikeException;
import com.cdzy.staff.mapper.EbikePermissionMapper;
import com.cdzy.staff.model.dto.EbikePermissionTreeNode;
import com.cdzy.staff.model.entity.EbikePermission;
import com.cdzy.staff.model.vo.EbikePermissionVo;
import com.cdzy.staff.service.EbikePermissionService;
import com.cdzy.staff.utils.TreeUtil;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.spring.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 系统权限表 服务层实现
*
@ -13,6 +22,73 @@ import org.springframework.stereotype.Service;
* @since 2025-08-07
*/
@Service
public class EbikePermissionServiceImpl extends ServiceImpl<EbikePermissionMapper, EbikePermission> implements EbikePermissionService{
public class EbikePermissionServiceImpl extends ServiceImpl<EbikePermissionMapper, EbikePermission> implements EbikePermissionService {
@Resource
private EbikePermissionMapper ebikePermissionMapper;
@Override
public void savePermission(EbikePermissionVo ebikePermission) {
Long parentId = ebikePermission.getParentId();
checkParent(parentId);
EbikePermission permission = EbikePermission.builder()
.name(ebikePermission.getName())
.type(ebikePermission.getType())
.path(ebikePermission.getPath())
.component(ebikePermission.getComponent())
.svgIcon(ebikePermission.getSvgIcon())
.redirect(ebikePermission.getRedirect())
.parentId(parentId)
.createBy(StpUtil.getLoginIdAsLong())
.build();
ebikePermissionMapper.insert(permission);
}
@Override
public void updatePermission(EbikePermissionVo ebikePermission) {
Long parentId = ebikePermission.getParentId();
checkParent(parentId);
EbikePermission permission = ebikePermissionMapper.selectOneById(ebikePermission.getPermissionId());
if (permission == null) {
throw new EbikeException("该页面/按钮不存在或已删除");
}
permission.setName(ebikePermission.getName());
permission.setType(ebikePermission.getType());
permission.setPath(ebikePermission.getPath());
permission.setComponent(ebikePermission.getComponent());
permission.setSvgIcon(ebikePermission.getSvgIcon());
permission.setRedirect(ebikePermission.getRedirect());
permission.setParentId(parentId);
permission.setUpdateBy(StpUtil.getLoginIdAsLong());
ebikePermissionMapper.update(permission);
}
@Override
public List<EbikePermissionTreeNode> tree() {
QueryWrapper queryWrapper = QueryWrapper.create()
.isNull(EbikePermission::getParentId);
List<EbikePermissionTreeNode> first = ebikePermissionMapper.selectListByQueryAs(queryWrapper,EbikePermissionTreeNode.class);
List<Long> firstIds = first.stream().map(EbikePermissionTreeNode::getPermissionId).toList();
queryWrapper.clear();
queryWrapper.in(EbikePermission::getParentId,firstIds);
List<EbikePermissionTreeNode> second = ebikePermissionMapper.selectListByQueryAs(queryWrapper,EbikePermissionTreeNode.class);
List<Long> secondIds = second.stream().map(EbikePermissionTreeNode::getPermissionId).toList();
queryWrapper.clear();
queryWrapper.in(EbikePermission::getParentId,secondIds);
List<EbikePermissionTreeNode> third = ebikePermissionMapper.selectListByQueryAs(queryWrapper,EbikePermissionTreeNode.class);
TreeUtil.permissionTree(first,second,third);
return first;
}
private void checkParent(Long parentId) {
if (parentId != null) {
EbikePermission permission = ebikePermissionMapper.selectOneById(parentId);
if (permission == null) {
throw new EbikeException("所选父级不存在或已删除");
}
}
}
}

View File

@ -1,5 +1,6 @@
package com.cdzy.staff.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.cdzy.common.ex.EbikeException;
import com.cdzy.staff.mapper.EbikeOperatorMapper;
import com.cdzy.staff.mapper.EbikeRoleMapper;
@ -53,6 +54,7 @@ public class EbikeRoleServiceImpl extends ServiceImpl<EbikeRoleMapper, EbikeRole
role.setRoleName(ebikeRole.getRoleName());
role.setRoleCode(ebikeRole.getRoleCode());
role.setDescription(ebikeRole.getDescription());
role.setUpdateBy(StpUtil.getLoginIdAsLong());
ebikeRoleMapper.update(role);
}

View File

@ -0,0 +1,35 @@
package com.cdzy.staff.utils;
import com.cdzy.staff.model.dto.EbikePermissionTreeNode;
import java.util.List;
import java.util.Objects;
/**
* @author attiya
* @since 2025-09-05
*/
public class TreeUtil {
/**
* 获取权限树形结构
*
* @param first 一级
* @param second 二级
* @param third 三级
*/
public static void permissionTree(List<EbikePermissionTreeNode> first, List<EbikePermissionTreeNode> second, List<EbikePermissionTreeNode> third) {
buildTree(second, third);
buildTree(first, second);
}
public static void buildTree(List<EbikePermissionTreeNode> parent, List<EbikePermissionTreeNode> child) {
parent.forEach(parentNode -> {
Long nodeId = parentNode.getPermissionId();
if (child != null && !child.isEmpty()) {
List<EbikePermissionTreeNode> list = child.stream().filter(Objects::nonNull).filter(childNode -> Objects.equals(nodeId, childNode.getParentId())).toList();
parentNode.setChildren(list);
}
});
}
}