前面完成了基础管理的相关API,接下来就得做一个菜单管理了,用于对接管理后台前端界面。
设计菜单结构
菜单是一个多级结构,所以我们得设计一个树形的。包含自己上级和下级的属性。同时预留Permission用于做可选的权限限制。
namespace Wheel.Domain.Menus
{
///
/// 菜单
///
public class Menu : Entity
{
///
/// 名称
///
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基本开发完成。
轮子仓库地址https://github.com/Wheel-Framework/Wheel
欢迎进群催更。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
延迟解析:V8是如何实现闭包的? 在编译JavaScript代码的过程中,V8并不会一次性将所有的JavaScript解析为中间代码,这主要是基于以下两点:首先,如果是一次性解析和编译所有代码,会影响首次编译的时间,会大大增加用户等待时间。其次,解析完成的字节…