1.asp.net core入门到造轮子-目录2.asp.net core之Startup3.asp.net core之依赖注入4.asp.net core之中间件5.asp.net core之Host6.asp.net core之Kestrel7.asp.net core之配置8.asp.net core之Options9.asp.net core之日志10.asp.net core之路由11.asp.net core之异常处理12.asp.net core之HttpClient13.asp.net core之实时应用14.asp.net core之EfCore15.造轮子之自动依赖注入16.造轮子之日志17.造轮子之统一业务异常处理18.造轮子之统一请求响应格式19.造轮子之缓存20.造轮子之ORM集成21.造轮子之asp.net core identity22.造轮子之自定义授权策略23.造轮子之权限管理24.造轮子之多语言管理25.造轮子之角色管理26.造轮子之用户管理
27.造轮子之菜单管理
28.造轮子之属性注入配合懒加载构建服务抽象基类29.造轮子之EventBus30.造轮子之消息实时推送31.造轮子之种子数据32.造轮子之集成GraphQL33.造轮子之设置管理34.造轮子之文件管理前面完成了基础管理的相关API,接下来就得做一个菜单管理了,用于对接管理后台前端界面。
设计菜单结构#
菜单是一个多级结构,所以我们得设计一个树形的。包含自己上级和下级的属性。同时预留Permission用于做可选的权限限制。
namespace Wheel.Domain.Menus
{
///
/// 菜单
///
public class Menu : Entity<Guid>
{
///
/// 名称
///
public string Name { get; set; }
///
/// 显示名称
///
public string DisplayName { get; set; }
///
/// 菜单类型
///
public MenuType MenuType { get; set; }
///
/// 菜单路径
///
public string? Path { get; set; }
///
/// 权限名称
///
public string? Permission { get; set; }
///
/// 图标
///
public string? Icon { get; set; }
///
/// 排序
///
public int Sort { get; set; }
///
/// 上级菜单Id
///
public virtual Guid? ParentId { get; set; }
///
/// 上级菜单
///
public virtual Menu? Parent { get; set; }
///
/// 子菜单
///
public virtual List
然后菜单和角色关联。创建RoleMenu表。
namespace Wheel.Domain.Menus
{
public class RoleMenu
{
public virtual string RoleId { get; set; }
public virtual Role Role { get; set; }
public virtual Guid MenuId { get; set; }
public virtual Menu Menu { get; set; }
}
}
修改DbContext#
接下来还是老套路,修改WheelDbContext
添加代码:
#region Menu
public DbSet
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
ConfigureIdentity(builder);
ConfigureLocalization(builder);
ConfigurePermissionGrants(builder);
ConfigureMenus(builder);
}
void ConfigureMenus(ModelBuilder builder)
{
builder.Entity
实现菜单管理#
实现MenuAppService#
IMenuAppService
namespace Wheel.Services.Menus
{
public interface IMenuAppService : ITransientDependency
{
Task Create(CreateOrUpdateMenuDto dto) ;
Task Update(Guid id, CreateOrUpdateMenuDto dto) ;
Task Delete(Guid id) ;
Task> GetById(Guid id);
Task>> GetList();
Task>> GetRoleMenuList(string roleId);
Task>> GetCurrentMenu();
Task UpdateRoleMenu(string roleId, UpdateRoleMenuDto dto) ;
}
}
MenuAppService
namespace Wheel.Services.Menus
{
public class MenuAppService : WheelServiceBase, IMenuAppService
{
private readonly IBasicRepository
实现MenuController#
namespace Wheel.Controllers
{
///
/// 菜单管理
///
[Route("api/[controller]")]
[ApiController]
public class MenuController : WheelControllerBase
{
private readonly IMenuAppService _menuAppService;
public MenuController(IMenuAppService menuAppService)
{
_menuAppService = menuAppService;
}
///
/// 新增菜单
///
///
///
[HttpPost()]
public Task Create(CreateOrUpdateMenuDto dto)
{
return _menuAppService.Create(dto);
}
///
/// 删除菜单
///
///
///
[HttpDelete("{id}")]
public Task Delete(Guid id)
{
return _menuAppService.Delete(id);
}
///
/// 获取单个菜单详情
///
///
///
[HttpGet("{id}")]
public Task> GetById(Guid id)
{
return _menuAppService.GetById(id);
}
///
/// 查询菜单列表
///
///
[HttpGet]
public Task>> GetList()
{
return _menuAppService.GetList();
}
///
/// 修改菜单
///
///
///
///
[HttpPut("{id}")]
public Task Update(Guid id, CreateOrUpdateMenuDto dto)
{
return _menuAppService.Update(id, dto);
}
///
/// 修改角色菜单
///
///
///
///
[HttpPut("role/{roleId}")]
public Task UpdateRoleMenu(string roleId, UpdateRoleMenuDto dto)
{
return _menuAppService.UpdateRoleMenu(roleId, dto);
}
///
/// 获取角色菜单列表
///
///
///
[HttpGet("role/{roleId}")]
public Task>> GetRoleMenuList(string roleId)
{
return _menuAppService.GetRoleMenuList(roleId);
}
}
}
就这样我们就完成了菜单管理相关的API功能,包含菜单的增删查改和角色菜单绑定功能。
到这里我们最基础的后台管理功能API基本开发完成。
