菜单权限功能设计
一. 方案1
菜单数据
菜单数据如果非常简单,固定不变,我们可以直接用json文件来维护。每个菜单有个id标识唯一性,菜单有父子关系,最多三级。有些菜单还支持配置按钮权限。
{"menu": [{"parent_id": "","id": "data_analysis","name": "数据分析","button_list": null,"children": [{"parent_id": "data_analysis","id": "data_analysis_1","name": "商家信息","button_list": [{"button_name": "搜索","button_id": "data_analysis_1_search"}],"children": []}]}]
}
路由权限数据
菜单和其相关的按钮都可以绑定多个路由,一个角色配置了菜单和按钮的权限,则其就具备对应的路由权限。路由权限数据也可用json来维护,内容就是简单的kv,key是菜单id或者按钮id,value是一个数组存一批路由。
{"data_analysis_1": ["/admin/data/list"],"data_analysis_1_search": ["/admin/data/detail"]
}
角色表和角色权限表
按照角色分配菜单权限,所以分配的对象是菜单。我们需要维护一个角色表。比如 admin_role, 核心字段就是角色的唯一标识,比如 role_id。
给用户分配的菜单,需要一个角色菜单表记录它们的关联。有些菜单中还有按钮等操作单元,我们统一可以记录角色和这些按钮操作的关系。所以创建个表,比如 admin_role_access。
表中字段
- menu_id_data:
- 存一个角色有哪些菜单配置,用json维护一个数组,元素就是每个菜单的id。
- 比如如果没用权限,那么 menu_id_data的值为 {"menu_data": []}
- 如果给某个角色勾选了一个菜单权限,这个菜单id就会存起来,比如{"menu_data": ["data_analysis", "data_analysis_1"]}
- button_id_data:
- 存一个角色有哪些菜单的button权限,也是用json维护的数组,元素就是每个button的id。
- 比如如果没用权限,那么 button_id_data的值为{"button_data": []}
- 如果给某个角色勾选了某个菜单下的按钮权限,这个按钮id就会存起来,比如{"button_data": ["data_analysis_1_search"]}