springBoot项目搭建包含RBAC模块 -- 菜单资源设计-自定义注解(五)

这一章是对后续资源管理用的思路进行讲解,用户角色权限离不开资源这个概念。我这边的资源是通过自定义注解的形式启动自动加载。

在common模块创建 annotation目录,在目录下我创建了四个自定义注解

 这四个注解都是用在controller层,这样我在项目启动的时候回去读取方法是否包含这些注解然后自动生成对应的资源。

package com.swh.common.annotation;

import java.lang.annotation.*;

/**
 * @ClassName ApiCode
 * @Description
 * @Author songWenHao
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(ApiCodes.class)
public @interface ApiCode {
    String menuName();
    Class<?> menuClass();
}
package com.swh.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @ClassName ApiCodes
 * @Description
 * @Author songWenHao
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiCodes {
    ApiCode[] value();
}
package com.swh.common.annotation;


import java.lang.annotation.*;

/**
 * @author songWenHao
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Menus.class)
public @interface Menu {

    String menuName();

    Class<?> menuClass();
}
package com.swh.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author songWenHao
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Menus {
    Menu[] value();
}

在common目录下创建menu目录,在这个目录下我创建了三个枚举类,用来定义资源的三级别,第一个级别是大菜单级别,第二个级别是菜单下的子菜单级别,第三个级别是按钮级别,用来达到权限控制的目的。


package com.swh.common.menu;

import com.swh.common.constant.MenuLevelOne;

/**
 * @ClassName LevelOneMenuEnum
 * @Description
 * @Author songWenHao
 */
public enum LevelOneMenuEnum implements MenuLevelOne {

    /**
     * 一级菜单 首页
     */
    MENU_HOME("001", "首页", "/home", "en-home-default", 1),

    /**
     * 一级菜单 系统配置
     */
    MENU_SYSTEM_CONFIG("002", "系统配置", "/system", "en-system-default", 2),

    ;


    private final String moduleCode;
    private final String moduleDesc;
    private final String path;
    private final String icon;
    private final int sort;

    LevelOneMenuEnum(String moduleCode, String moduleDesc, String path, String icon, int sort) {
        this.moduleCode = moduleCode;
        this.moduleDesc = moduleDesc;
        this.path = path;
        this.icon = icon;
        this.sort = sort;
    }


    @Override
    public String getModuleCode() {
        return this.moduleCode;
    }

    @Override
    public String getModuleDesc() {
        return this.moduleDesc;
    }

    @Override
    public String getPath() {
        return this.path;
    }

    @Override
    public String getIcon() {
        return this.icon;
    }

    @Override
    public int getSort() {
        return this.sort;
    }

    @Override
    public String getDisplayFlag() {
        return "Y";
    }

}


package com.swh.common.menu;

import com.swh.common.constant.MenuLevelTwo;

/**
 * @ClassName LevelTwoMenuEnum
 * @Description
 * @Author songWenHao
 */
public enum LevelTwoMenuEnum implements MenuLevelTwo {


    // === 首页 ===


    // ==== 系统配置 ====
    MENU_ADMIN_USER_CONFIG(LevelOneMenuEnum.MENU_SYSTEM_CONFIG, "101", "用户管理", "/system/adminUserConfig", "", 101),

    // ==== 系统配置 ====
    MENU_ADMIN_ROLE_CONFIG(LevelOneMenuEnum.MENU_SYSTEM_CONFIG, "102", "角色管理", "/system/adminRoleConfig", "", 102),



    ;
    private final String moduleCode;
    private final String moduleDesc;
    private final String funCode;
    private final String funDesc;
    private final String path;
    private final String icon;
    private final int sort;
    private final String displayFlag;

    LevelTwoMenuEnum(LevelOneMenuEnum level1, String funCode, String funDesc, String path, String icon, int sort) {
        this.moduleCode = level1.getModuleCode();
        this.moduleDesc = level1.getModuleDesc();
        this.funCode = funCode;
        this.funDesc = funDesc;
        this.path = path;
        this.icon = icon;
        this.sort = sort;
        this.displayFlag = "Y";
    }

    LevelTwoMenuEnum(LevelOneMenuEnum level1, String funCode, String funDesc, String path, String icon, int sort, String displayFlag) {
        this.moduleCode = level1.getModuleCode();
        this.moduleDesc = level1.getModuleDesc();
        this.funCode = funCode;
        this.funDesc = funDesc;
        this.path = path;
        this.icon = icon;
        this.sort = sort;
        this.displayFlag = "N";
    }


    @Override
    public String getModuleCode() {
        return this.moduleCode;
    }

    @Override
    public String getModuleDesc() {
        return this.moduleDesc;
    }

    @Override
    public String getFunCode() {
        return this.funCode;
    }

    @Override
    public String getFunDesc() {
        return this.funDesc;
    }

    @Override
    public String getPath() {
        return this.path;
    }

    @Override
    public String getIcon() {
        return this.icon;
    }

    @Override
    public int getSort() {
        return this.sort;
    }

    @Override
    public String getDisplayFlag() {
        return this.displayFlag;
    }

}

package com.swh.common.menu;

import com.swh.common.constant.MenuLevelThree;

import static com.swh.common.constant.AdminUserConst.Url.*;
import static com.swh.common.menu.LevelTwoMenuEnum.MENU_ADMIN_ROLE_CONFIG;
import static com.swh.common.menu.LevelTwoMenuEnum.MENU_ADMIN_USER_CONFIG;


/**
 * @ClassName LevelThreeMenuEnum
 * @Description
 * @Author songWenHao
 */
public enum LevelThreeMenuEnum implements MenuLevelThree {

    /*
     * 三级菜单  用户管理员
     */

    /**
     * 分页查询
     */
    MENU_ADMIN_USER_LIST_PAGE(MENU_ADMIN_USER_CONFIG, "001", "用户分页查询", ADMIN_USER_LIST_PAGE),

    /**
     * 新增
     */
    MENU_ADMIN_USER_ADD(MENU_ADMIN_USER_CONFIG, "002", "用户新增", ADMIN_USER_ADD),
    /**
     * 更新
     */
    MENU_ADMIN_USER_UPDATE(MENU_ADMIN_USER_CONFIG, "003", "用户修改", ADMIN_USER_UPDATE),
    /**
     * 批量删除
     */
    MENU_ADMIN_USER_BATCH_DEL(MENU_ADMIN_USER_CONFIG, "004", "用户批量删除", ADMIN_USER_BATCH_DEL),

    /**
     * 状态变更
     */
    MENU_ADMIN_USER_CHANGE_STATE(MENU_ADMIN_USER_CONFIG, "005", "用户状态变更", ADMIN_USER_STATE_CHANGE),

    /**
     * 密码修改
     */
    MENU_ADMIN_USER_PASSWORD_CHANGE(MENU_ADMIN_USER_CONFIG, "006", "用户密码修改", ADMIN_USER_PASSWORD_CHANGE),

    /**
     * 密码重置
     */
    MENU_ADMIN_USER_PASSWORD_RESET(MENU_ADMIN_USER_CONFIG, "007", "用户密码重置", ADMIN_USER_PASSWORD_RESET),

    /**
     * 角色 分页查询
     */
    MENU_ADMIN_ROLE_LIST_PAGE(MENU_ADMIN_ROLE_CONFIG, "201", "角色分页", ADMIN_ROLE_LIST_PAGE),

    /**
     * 角色 新增
     */
    MENU_ADMIN_ROLE_ADD(MENU_ADMIN_ROLE_CONFIG, "202", "角色新增", ADMIN_ROLE_ADD),

    /**
     * 角色 修改
     */
    MENU_ADMIN_ROLE_UPDATE(MENU_ADMIN_ROLE_CONFIG, "203", "角色修改", ADMIN_ROLE_UPDATE),

    /**
     * 角色 批量删除
     */
    MENU_ADMIN_ROLE_BATCH_DEL(MENU_ADMIN_ROLE_CONFIG, "204", "角色批量删除", ADMIN_ROLE_BATCH_DEL),

    /**
     * 角色 获取所有
     */
    MENU_ADMIN_ROLE_BATCH_ALL(MENU_ADMIN_ROLE_CONFIG, "205", "角色获取所有", ADMIN_ROLE_BATCH_ALL),

    /**
     * 资源树的获取
     */
    MENU_ADMIN_RES_ALL(MENU_ADMIN_ROLE_CONFIG, "301", "资源树的获取", ADMIN_RES_GET_ALL),

    /**
     * 菜单树
     */
    MENU_ADMIN_MENU_ALL(MENU_ADMIN_ROLE_CONFIG, "302", "菜单树的获取", ADMIN_MENU_GET_ALL),

    /**
     * 菜单项更新
     */
    MENU_ADMIN_MENU_UPDATE(MENU_ADMIN_ROLE_CONFIG, "303", "菜单项更新", ADMIN_MENU_INFO_UPDATE),


    ;

    private final String moduleCode;
    private final String moduleDesc;
    private final String funCode;
    private final String funDesc;
    private final String operCode;
    private final String operDesc;
    private final String path;


    LevelThreeMenuEnum(LevelTwoMenuEnum level2, String operCode, String operDesc, String path) {
        this.moduleCode = level2.getModuleCode();
        this.moduleDesc = level2.getModuleDesc();
        this.funCode = level2.getFunCode();
        this.funDesc = level2.getFunDesc();
        this.operCode = operCode;
        this.operDesc = operDesc;
        this.path = path;
    }

    @Override
    public String getPath() {
        return this.path;
    }

    @Override
    public String getModuleCode() {
        return this.moduleCode;
    }

    @Override
    public String getModuleDesc() {
        return this.moduleDesc;
    }

    @Override
    public String getFunCode() {
        return this.funCode;
    }

    @Override
    public String getFunDesc() {
        return this.funDesc;
    }

    @Override
    public String getOperCode() {
        return this.operCode;
    }

    @Override
    public String getOperDesc() {
        return this.operDesc;
    }


}

自定义的注解和枚举类如何使用我们在后续的代码层面用的时候在具体体现出来。 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
适用人群所有的IT从业者,尤其适合快速掌握新技术,快速增长工作经验人群,对教育公平,教育公益,教育爱心公益人士课程概述课程概述该互联网实战项目是基于腾讯开源Tdesign产品框架,前后端分离,开发项目实战,SpringBoot+SpringSecurity+Mybatisplus+MySQL+Knife4j中后台项目产品实战,包括图形展示、权限管理、用户管理等功能。【后端】Spring Boot2 框架 开发的一站式解决方案Spring Security5 认证和授权框架MyBatisPlus3.3.1 基于 MyBatis 框架的快速研发框架MyBatisCode工具生成 MyBatis 相关代码Jackson提供了处理 JSON 数据的工具Lombok简化对象封装工具 Druid   数据库连接池 【前端技术】Vue       互联网最火的前端框架Vue Router路由框架Vuex全局状态管理框架Axios前端 HTTP 框架TDesign 前端模板TDesign 是腾讯各业务团队在服务业务过程中沉淀的一套企业级设计体系。TDesign 提供了开箱即用的 UI 组件库、设计指南 和相关 设计资产,以优雅高效的方式将设计和研发从重复劳动中解放出来,同时方便大家在 TDesign 的基础上扩展,更好的的贴近业务需求。在腾讯内部以开源协同的方式,共建一个完善、易用的设计体系和组件库产品。【开发工具】IntelliJ IDEA开发 IDESQLyog数据库连接客户端PostmanHTTP 请求工具【开发环境】工具版本JDK1.8MySQL5.7 
资源说明】 1、基于SpringBoot+Nuxt的服务端渲染博客系统源码+数据库+项目说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于SpringBoot+Nuxt的服务端渲染博客系统源码+数据库+项目说明.zip ### 简介 基于 SpringBoot 和 Nuxt 的前后端分离博客 ### SQL文件 blog.sql 初始账号密码:Linter ### Nginx配置 ``` location / { proxy_pass http://127.0.0.1:3000; } location ~ .*\.(gif|jpg|jpeg|png)$ { proxy_pass http://127.0.0.1:3000; } location ~ .*\.(js|css|woff|ttf|ico)?$ { proxy_pass http://127.0.0.1:3000; } ``` ### 截图 #### 首页 ![首页](screenshot/blog-index.png) #### 登录 ![登录](screenshot/blog-login.png) #### 分类 ![分类](screenshot/blog-catalog.png) #### 文章 ![文章](screenshot/blog-article.png) #### 评论 ![评论](screenshot/blog-comment-new.png) #### 搜索 ![搜索](screenshot/blog-search.png) #### 后台首页 ![后台首页](screenshot/blog-admin-index.png) #### 发布文章 ![发布文章](screenshot/blog-article-new.png) #### 文章管理 ![文章管理](screenshot/blog-article-list.png) #### 新增分类 ![新增分类](screenshot/blog-category-new.png) #### 编辑分类 ![编辑分类](screenshot/blog-category-edit.png) #### 分类管理 ![分类管理](screenshot/blog-category-list.png) #### 评论管理 ![评论管理](screenshot/blog-comment-list.png) #### 新增用户 ![新增用户](screenshot/blog-user-new.png) #### 用户管理 ![用户管理](screenshot/blog-user-list.png)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值