设计一个简单的菜单权限系统的Java代码实现。在这个方案中,将会设计一个简单的菜单权限系统,其中包括菜单项、角色和用户,用户拥有特定的角色,角色对应着不同的菜单权限。

首先,我们需要定义几个核心的类:

  • MenuItem:表示菜单项。
  • Role:表示角色。
  • User:表示用户。 一步步来实现这些类及其相互关系。

设计思想

菜单项(MenuItem):

  • MenuItem类表示系统中的菜单项,每个菜单项都可以包含子菜单项。
  • 使用一个列表来存储子菜单项,这样可以方便地添加和管理菜单项的层级结构。

角色(Role):

  • Role类表示系统中的角色,每个角色都拥有特定的菜单权限。
  • 使用一个列表来存储角色具有访问权限的菜单项。

用户(User):

  • User类表示系统中的用户,每个用户都被分配到一个角色。
  • 每个用户关联一个角色,通过角色来确定用户的菜单权限。

权限检查(PermissionChecker):

  • PermissionChecker类包含了一个静态方法hasPermission,用于检查用户是否有权限访问特定的菜单项。
  • 如果用户拥有直接访问菜单项的权限,则返回true;否则,递归检查菜单项的子菜单项,直到找到有权限的菜单项或者遍历完所有的子菜单项。

基本数据结构

import java.util.ArrayList;
import java.util.List;

// 菜单项类
class MenuItem {
    private String name;
    private List<MenuItem> subMenuItems;

    public MenuItem(String name) {
        this.name = name;
        this.subMenuItems = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    public List<MenuItem> getSubMenuItems() {
        return subMenuItems;
    }

    public void addSubMenu(MenuItem subMenuItem) {
        subMenuItems.add(subMenuItem);
    }
}

// 角色类
class Role {
    private String name;
    private List<MenuItem> permittedMenus;

    public Role(String name) {
        this.name = name;
        this.permittedMenus = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    public List<MenuItem> getPermittedMenus() {
        return permittedMenus;
    }

    public void addPermittedMenu(MenuItem menuItem) {
        permittedMenus.add(menuItem);
    }
}

// 用户类
class User {
    private String name;
    private Role role;

    public User(String name, Role role) {
        this.name = name;
        this.role = role;
    }

    public String getName() {
        return name;
    }

    public Role getRole() {
        return role;
    }
}

以上代码定义了菜单项、角色和用户的基本结构。接下来,我们将实现一个简单的权限检查方法。

权限检查方法

// 权限检查类
class PermissionChecker {
    public static boolean hasPermission(User user, MenuItem menuItem) {
        Role userRole = user.getRole();
        List<MenuItem> permittedMenus = userRole.getPermittedMenus();
        
        return permittedMenus.contains(menuItem) || checkSubMenuItems(user, menuItem);
    }

    private static boolean checkSubMenuItems(User user, MenuItem menuItem) {
        List<MenuItem> subMenuItems = menuItem.getSubMenuItems();
        for (MenuItem subMenuItem : subMenuItems) {
            if (hasPermission(user, subMenuItem)) {
                return true;
            }
        }
        return false;
    }
}

在上述代码中,PermissionChecker类包含了一个hasPermission方法,用于检查给定用户是否有权限访问特定的菜单项。如果用户拥有直接访问该菜单项的权限,则返回true;否则,会递归检查菜单项的子菜单项,直到找到有权限的菜单项或者遍历完所有的子菜单项。

接下来,我们将演示如何使用这些类。

权限实现

public class Main {
    public static void main(String[] args) {
        // 创建菜单项
        MenuItem mainMenu = new MenuItem("Main Menu");
        MenuItem subMenu1 = new MenuItem("Sub Menu 1");
        MenuItem subMenu2 = new MenuItem("Sub Menu 2");
        mainMenu.addSubMenu(subMenu1);
        mainMenu.addSubMenu(subMenu2);

        // 创建角色并分配权限
        Role adminRole = new Role("Admin");
        adminRole.addPermittedMenu(mainMenu);
        adminRole.addPermittedMenu(subMenu1);

        Role userRole = new Role("User");
        userRole.addPermittedMenu(mainMenu);

        // 创建用户并分配角色
        User adminUser = new User("AdminUser", adminRole);
        User normalUser = new User("NormalUser", userRole);

        // 检查权限
        System.out.println("Admin user permissions:");
        checkPermissions(adminUser, mainMenu, subMenu1, subMenu2);

        System.out.println("\nNormal user permissions:");
        checkPermissions(normalUser, mainMenu, subMenu1, subMenu2);
    }

    private static void checkPermissions(User user, MenuItem... menuItems) {
        for (MenuItem menuItem : menuItems) {
            System.out.println(menuItem.getName() + ": " + 
                               (PermissionChecker.hasPermission(user, menuItem) ? "Granted" : "Denied"));
        }
    }
}

在上述代码中,我们创建了两个角色(Admin和User),并分配了不同的菜单权限。然后,我们创建了两个用户,一个是管理员,一个是普通用户。最后,我们检查了每个用户对于不同菜单项的权限。

这样,我们就完成了一个简单的菜单权限设计方案的Java代码实现。整个流程包括了菜单项、角色、用户的定义以及权限检查功能。