谷粒学院项目

299 阅读3分钟

谷粒学院项目

Canal数据同步工具:

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

Canal数据同步(客户端代码编写):

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

GateWay网关:

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

启动类:

捕获.PNG

捕获.PNG

捕获.PNG

权限管理:

捕获.PNG

捕获.PNG

捕获.PNG

权限管理--递归查询所有菜单:

返回给前端的entity:

package com.atguigu.aclservice.entity;

import com.baomidou.mybatisplus.annotation.*;

import java.util.Date;
import java.io.Serializable;
import java.util.List;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 权限
 * </p>
 *
 * @author testjava
 * @since 2020-01-12
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("acl_permission")
@ApiModel(value="Permission对象", description="权限")
public class Permission implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "编号")
    @TableId(value = "id", type = IdType.ID_WORKER_STR)
    private String id;

    @ApiModelProperty(value = "所属上级")
    private String pid;

    @ApiModelProperty(value = "名称")
    private String name;

    @ApiModelProperty(value = "类型(1:菜单,2:按钮)")
    private Integer type;

    @ApiModelProperty(value = "权限值")
    private String permissionValue;

    @ApiModelProperty(value = "访问路径")
    private String path;

    @ApiModelProperty(value = "组件路径")
    private String component;

    @ApiModelProperty(value = "图标")
    private String icon;

    @ApiModelProperty(value = "状态(0:禁止,1:正常)")
    private Integer status;

    @ApiModelProperty(value = "层级")
    @TableField(exist = false)
    private Integer level;

    @ApiModelProperty(value = "下级")
    @TableField(exist = false)
    private List<Permission> children;

    @ApiModelProperty(value = "是否选中")
    @TableField(exist = false)
    private boolean isSelect;


    @ApiModelProperty(value = "逻辑删除 1(true)已删除, 0(false)未删除")
    private Boolean isDeleted;

    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private Date gmtCreate;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    @ApiModelProperty(value = "更新时间")
    private Date gmtModified;


}

具体实现:

//==============================递归查询所有菜单================================================
    //获取全部菜单
    @Override
    public List<Permission> queryAllMenuGuli() {
        //1 查询菜单表所有数据
        QueryWrapper<Permission> wrapper = new QueryWrapper<>();
        wrapper.orderByDesc("id");
        List<Permission> permissionList = baseMapper.selectList(wrapper);
        //2 把查询所有菜单list集合按照要求进行封装
        List<Permission> resultList = bulidPermission(permissionList);
        return resultList;
    }

    //把返回所有菜单list集合进行封装的方法
    public static List<Permission> bulidPermission(List<Permission> permissionList) {

        //创建list集合,用于数据最终封装
        List<Permission> finalNode = new ArrayList<>();
        //把所有菜单list集合遍历,得到顶层菜单 pid=0菜单,设置level是1
        for(Permission permissionNode : permissionList) {
            //得到顶层菜单 pid=0菜单
            if("0".equals(permissionNode.getPid())) {
                //设置顶层菜单的level是1
                permissionNode.setLevel(1);
                //根据顶层菜单,向里面进行查询子菜单,封装到finalNode里面
                finalNode.add(selectChildren(permissionNode,permissionList));
            }
        }
        // 这个finalNode列表里面只有一个Permission节点  就是那个顶层菜单的节点
        return finalNode;
    }

    // 这个方法返回的还是传入到该方法里面的这个 permissionNode 节点
    // 将permissionNode这个节点的Children列表设置好值,返回permissionNode节点
    private static Permission selectChildren(Permission permissionNode, List<Permission> permissionList) {
        //1 因为向一层菜单里面放二层菜单,二层里面还要放三层,把对象初始化
        permissionNode.setChildren(new ArrayList<Permission>());

        //2 遍历所有菜单list集合,进行判断比较,比较id和pid值是否相同
        for(Permission it : permissionList) {
            //判断 id和pid值是否相同
            if(permissionNode.getId().equals(it.getPid())) {
                //把父菜单的level值+1
                int level = permissionNode.getLevel()+1;
                it.setLevel(level);
                //如果children为空,进行初始化操作
                if(permissionNode.getChildren() == null) {
                    permissionNode.setChildren(new ArrayList<Permission>());
                }
                //把查询出来的子菜单放到父菜单里面
                permissionNode.getChildren().add(selectChildren(it,permissionList));
            }
        }
        return permissionNode;
    }

权限管理--递归删除菜单:

//============递归删除菜单==================================
@Override
public void removeChildByIdGuli(String id) {
    //1 创建list集合,用于封装所有删除菜单id值
    List<String> idList = new ArrayList<>();
    //2 向idList集合设置删除菜单id
    this.selectPermissionChildById(id,idList);
    //把当前id封装到list里面
    idList.add(id);
    baseMapper.deleteBatchIds(idList);
}

//2 根据当前菜单id,查询菜单里面子菜单id,封装到list集合
private void selectPermissionChildById(String id, List<String> idList) {
    //查询菜单里面子菜单id
    QueryWrapper<Permission>  wrapper = new QueryWrapper<>();
    wrapper.eq("pid",id);
    wrapper.select("id");
    List<Permission> childIdList = baseMapper.selectList(wrapper);
    //把childIdList里面菜单id值获取出来,封装idList里面,做递归查询
    childIdList.stream().forEach(item -> {
        //封装idList里面
        idList.add(item.getId());
        //递归查询
        this.selectPermissionChildById(item.getId(),idList);
    });
}

权限管理--角色分配菜单:

//=========================给角色分配菜单=======================
@Override
public void saveRolePermissionRealtionShipGuli(String roleId, String[] permissionIds) {
    //roleId角色id
    //permissionId菜单id 数组形式
    //1 创建list集合,用于封装添加数据
    List<RolePermission> rolePermissionList = new ArrayList<>();
    //遍历所有菜单数组
    for(String perId : permissionIds) {
        //RolePermission对象
        RolePermission rolePermission = new RolePermission();
        rolePermission.setRoleId(roleId);
        rolePermission.setPermissionId(perId);
        //封装到list集合
        rolePermissionList.add(rolePermission);
    }
    //添加到角色菜单关系表
    rolePermissionService.saveBatch(rolePermissionList);
}

SpringSecurity介绍:

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

权限管理--整合SpringSecurity:

捕获.PNG

捕获.PNG

捕获.PNG

3、捕获.PNG

4、略

权限管理--整合SpringSecurity代码执行过程:

捕获.PNG

捕获.PNG

Nacos配置中心:

捕获.PNG

SpringBoot配置文件加载过程:

捕获.PNG

Nacos配置中心(命名空间切换):

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

远程Git仓库:

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG 捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG 捕获.PNG

捕获.PNG

捕获.PNG

项目部署(手动打包运行):

捕获.PNG 捕获.PNG 捕获.PNG 捕获.PNG 捕获.PNG 捕获.PNG 捕获.PNG

项目部署(自动打包运行):

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

捕获.PNG

安装jenkins:

捕获.PNG

捕获.PNG 捕获.PNG 捕获.PNG 捕获.PNG 捕获.PNG 下略...