『贴代码』
PasteSpider
PasteApeart
精选作品
优选问答
成长笔记
【本期话题】更多
                                    我们在开发中经常遇到对方的接口请求有频率限制,比如当前接口每秒的请求不能大于100,不能大于1000,对于这样的,我们作为请求方,如何做限定?
                    
PasteApeart中的绑定功能实现详解 —— 以角色绑定权限为例
念之森蓝 2026-03-19 131 2 4
在开发后台管理系统时,经常会遇到多对多关系的绑定操作,比如角色与权限的绑定、用户与角色的绑定等。PasteApeart提供了一套优雅的解决方案,让我们能够快速实现这类功能。本文将以角色绑定权限为例,详细介绍整个实现流程。

--------------------------------------------------------------------------------------------------------------

PasteForm的升级版PasteApeart,享受极致简洁的框架的魅力,点击查看文档

--------------------------------------------------------------------------------------------------------------

前言

在开发后台管理系统时,经常会遇到多对多关系的绑定操作,比如角色与权限的绑定、用户与角色的绑定等。PasteApeart提供了一套优雅的解决方案,让我们能够快速实现这类功能。本文将以角色绑定权限为例,详细介绍整个实现流程。

数据表结构

首先,我们需要三个基础表:

  • RoleInfo(权限信息表):存储系统中的所有权限
  • GradeInfo(角色信息表):存储系统中的所有角色
  • GradeRole(角色权限关联表):存储角色与权限的对应关系

实现步骤

第一步:在角色列表中添加绑定入口

在 GradeInfoListDto 中添加一个菜单字段,用于触发绑定操作:

/// <summary>
/// 权限绑定入口
/// </summary>
[PasteMenu("绑定权限", "open_window('绑定权限','pasteform/index.html?path=roleInfo&model=bind&grade_id={{:=item.id}}','80%','80%')")]
[Description("权限绑定")]
public int Menu1 { get; } = 0;

这里的 open_window 函数会打开一个新窗口,URL中携带了当前角色的ID(grade_id),用于后续查询。

第二步:配置查询参数

在 InputQueryRoleInfo 中添加接收角色ID的字段:

/// <summary>
/// 角色ID - 用于查询指定角色已拥有的权限
/// </summary>
[PasteQuery("grade_id", true)]
[PasteHidden] // 默认隐藏,仅用于查询传递
[PasteExtendBind("GradeRole", "RoleId", "GradeId", "grade_id")]
[Description("角色ID")]
public int GradeId { get; set; }

关键属性说明:

  • PasteQuery:标记该字段为查询参数
  • PasteHidden:在界面中隐藏该字段
  • PasteExtendBind:配置扩展绑定的关联关系

第三步:配置绑定状态字段

在 RoleInfoListDto 中添加绑定状态字段:

/// <summary>
/// 扩展绑定 - 标记该权限是否已被当前角色拥有
/// </summary>
[PasteSwitch("bind")]
[PasteHidden("bind")]
[PasteExtendBind("GradeRole", "RoleId", "GradeId", "grade_id")]
[Description("是否已绑定")]
public bool ExtendBind { get; set; }

PasteSwitch 属性会在界面上生成一个开关控件,用户可以通过它来切换绑定状态。

工作原理

1. 数据加载流程

  1. 用户在角色列表中点击某角色的”绑定权限”按钮
  2. 系统打开权限列表页面,并在URL中携带 grade_id 参数
  3. InputQueryRoleInfo 中的 GradeId 字段接收到该参数
  4. 权限列表查询时,根据 grade_id 到 GradeRole 表中查找该角色已拥有的权限
  5. ExtendBind 字段会自动根据查询结果设置为 true(已绑定)或 false(未绑定)

2. 交互流程

  • 权限列表以表格形式展示,每条记录都有一个开关控件
  • 用户可以通过开关来为角色绑定或解绑权限
  • 开关状态的变化会自动记录操作结果

3. 数据提交

DefaultAppService 中的 updateState 方法会自动处理绑定状态的变更:

  • 当开关从 false 变为 true 时,向 GradeRole 表插入一条关联记录
  • 当开关从 true 变为 false 时,从 GradeRole 表中删除对应的关联记录

完整示例代码

GradeInfoListDto(角色列表DTO)

public class GradeInfoListDto
{
    public int Id { get; set; }

    public string GradeName { get; set; }

    /// <summary>
    /// 权限绑定入口
    /// </summary>
    [PasteMenu("绑定权限", "open_window('绑定权限','pasteform/index.html?path=roleInfo&model=bind&grade_id={{:=item.id}}','80%','80%')")]
    [Description("权限绑定")]
    public int Menu1 { get; } = 0;
}

InputQueryRoleInfo(权限查询DTO)

public class InputQueryRoleInfo
{
    /// <summary>
    /// 角色ID - 用于查询角色已拥有的权限
    /// </summary>
    [PasteQuery("grade_id", true)]
    [PasteHidden]
    [PasteExtendBind("GradeRole", "RoleId", "GradeId", "grade_id")]
    [Description("角色ID")]
    public int GradeId { get; set; }
}

RoleInfoListDto(权限列表DTO)

public class RoleInfoListDto
{
    public int Id { get; set; }

    public string RoleName { get; set; }

    public string PermissionCode { get; set; }

    /// <summary>
    /// 扩展绑定 - 当前角色是否拥有此权限
    /// </summary>
    [PasteSwitch("bind")]
    [PasteHidden("bind")]
    [PasteExtendBind("GradeRole", "RoleId", "GradeId", "grade_id")]
    [Description("是否已绑定")]
    public bool ExtendBind { get; set; }
}

总结

通过PasteApeart的扩展绑定功能,我们只需要简单的几步配置,就能实现复杂的多对多关系绑定操作。这种方式不仅代码量少,而且功能完善,大大提高了开发效率。其核心优势在于:

  1. 配置简单:通过几个特性标签就能完成配置
  2. 功能完整:自动处理数据查询、状态展示、变更提交
  3. 体验良好:提供直观的开关控件进行绑定操作
  4. 扩展性强:支持任意多对多关系的绑定
评论列表
念之森蓝
2 131 4
快捷注册
用户问答更多
PasteApeart和PasteForm如何选择?
  • 不用选,后面都是PasteApeart,他们其实是一个东西

PasteApeart中有多层级继承的,表单中的字段排列顺序有什么规则?
  • 看版本,PasteApeart.Helper 26.9.2之后,就按照基类前面的顺序了,也符合阅读顺序,当然你可以使用PasteSort再次改变他!

PasteForm,神奇了啊!都说低代码,低代码,那个是对于非开发者来说的,感觉PasteForm就是开发者的低代码啊!只要配置好Model,就有对应的CRUD操作,还带一些逻辑,和生成代码是两码事了!!!问题来了,有什么局限性,或者适用哪些场景?
  • 1.语言吧,这本身只是一个开发思想,其实其他语言也可以用,不过最优雅实现的还是.NET

    2.特别适用于需要表单,表格的系统,所以哪些EMS,CRM,ERP等都合适

    3.扩展,比如这个思想,你也可以应用于C/S,理论上也是可以的

    4.这个主要针对的是管理端,附带UI的CRUD,也就是说对于业务代码,是没影响的!

    5.可能入门会麻烦点,毕竟有接近100个PasteXXXX特性要了解,幸运的是都是Paste开头,官方的也支持,比如MaxLength,Required等!

最新动态
  • 40.****.51 正在查看 Document:spider !
  • 117.****.119 正在查看 千呼万唤始出来,按钮控制终于来了!!!PasteApeart实现权限按钮就是这么简单 !
  • 185.****.13 正在查看 贴代码框架PasteApeart之VS2022右键代码生成器插件介绍 !
  • 40.****.48 正在查看 文章列表页 !
  • 40.****.27 正在查看 PasteApeart框架开发之Entity多级嵌套的表单的实现 !
  • 216.****.137 正在查看 文章列表页 !
  • 52.****.169 正在查看 文章列表页 !
  • 52.****.169 正在查看 文章列表页 !
  • 216.****.137 正在查看 超越AI编码:为什么说PasteApeart是AI时代的终极WEB框架 !
  • 216.****.137 正在查看 PasteApeart和PasteForm的区别,看这一篇就够了 !
  • 216.****.137 正在查看 PasteApeart框架介绍,PasteApeart为啥说是敏佳开发天花板,看这篇就够了 !
欢迎加入QQ讨论群 296245685 [PasteSpider]介绍 [PasteForm]介绍 @2022-2023 PasteCode.cn 版权所有 ICP证 闽ICP备2021013869号-2