数据库表格的设计
菜单的实体类
定义菜单数据模型: 首先,你需要定义一个菜单数据模型来表示菜单项。该模型应当包含菜单的ID、名称、URL以及子菜单列表等属性。
查询数据库: 在数据库中存储菜单项的数据,并编写适当的查询方法从数据库中检索菜单项数据。你可以使用Entity Framework Core或其他适用的ORM工具来简化数据库查询工作。
构建递归菜单: 在你获取菜单项数据后,通过递归方法来构建递归菜单。递归方法将遍历菜单项列表,并根据菜单项的父子关系递归地构建菜单层次结构。最终,该方法将返回一个拥有正确层次结构的菜单项列表。
public class MenuInfo : BaseEntity
{
//[Column(TypeName = "varchar(36)")]
//public string Id { get; set; } /*主键Id */
[Column(TypeName = "varchar(36)")]
public string Title { get; set; } /*标题 */
[Column(TypeName = "varchar(36)")]
public string? Description { get; set; } /*描述 */
public int Level { get; set; }/*等级 */
public int Sort { get; set; } /*排序 */
[Column(TypeName = "varchar(100)")]
public string? Href { get; set; } /*访问地址*/
[Column(TypeName = "varchar(36)")]
public string? ParentId { get; set; } /*父菜单id*/
[Column(TypeName = "varchar(36)")]
public string Icon { get; set; } /*图标样式*/
[Column(TypeName = "varchar(36)")]
public string Target { get; set; } /*目标 */
public DateTime CreateTime { get; set; } /*添加时间*/
public bool IsDelete { get; set; }/*是否删除*/
public DateTime? DeleteTime { get; set; }/*删除时间*/
}
我是通过继承BaseEntity来使用里面的id,这样每次创建实体类就不需要手动加id字段了。
其中可以通过ParentId来实现多级菜单,后面会进行数据库展示。
业务逻辑层Bll
从数据源获取菜单数据: 接下来,你需要从数据源(如数据库)中获取菜单数据并构建菜单项。可以使用Entity Framework Core或其他数据访问技术来查询菜单数据。
在递归方法中,你可以首先查询具有特定父菜单ID的菜单项,并对每个菜单项进行递归调用,处理其子菜单。
/// <summary>
/// 获取菜单
/// </summary>
/// <returns></returns>
public List<HomeIndexMenu> HomeIndexMenuInfo(string userId)
{
UserInfo userInfo = _userInfoDAL.GetInfos().FirstOrDefault(u => u.Id == userId);
if (userInfo == null)
{
return new List<HomeIndexMenu>();
}
List<HomeIndexMenu> GetMenu;
//是否是管理员
if (userInfo.IsAdmin)
{
GetMenu = _MenuInfoDAL.GetInfos().Select(m => new HomeIndexMenu()
{
Title = m.Title,
Target = m.Target,
Href = m.Href,
Icon = m.Icon,
Level = m.Level,
ParentId = m.ParentId,
Id = m.Id
}).ToList();
}
else
{
List<string> GetMenuId = (from ur in _role_UserInfoDAL.GetInfos().Where(u => u.UserId == userId)
join
rm in _R_Role_MenuDAL.GetInfos()
on ur.RoleId equals rm.RoleId
select rm.MenuId).ToList();
//先查出所有的菜单
GetMenu = _MenuInfoDAL.GetInfos().Where(m => GetMenuId.Contains(m.Id)).Select(m => new HomeIndexMenu()
{
Title = m.Title,
Target = m.Target,
Href = m.Href,
Icon = m.Icon,
Level = m.Level,
ParentId = m.ParentId,