我们在开发中经常遇到对方的接口请求有频率限制,比如当前接口每秒的请求不能大于100,不能大于1000,对于这样的,我们作为请求方,如何做限定?
--------------------------------------------------------------------------------------------------------------
PasteForm的升级版PasteApeart,享受极致简洁的框架的魅力,点击查看文档
--------------------------------------------------------------------------------------------------------------
要实现页面按钮权限控制,你得PasteApeartHelper的版本必须是26.1.5以上!
<PackageReference Include="PasteApeartHelper" Version="26.1.6" />
之前我们把Dto转化成管理端元数据使用的函数是
/// <summary>
/// 读取ListDto的数据模型
/// </summary>
/// <returns></returns>
[HttpGet]
public VoloModelInfo ReadListModel()
{
var _model = PasteBuilderHelper.AttributeReadModelProperty<GradeInfoListDto>(new GradeInfoListDto());
var _query_model = PasteBuilderHelper.AttributeReadModelProperty(new InputQueryGradeInfo());
if (_query_model != null)
{
_model.QueryProperties = _query_model.Properties;
}
return _model;
}
关键点就是
AttributeReadModelProperty
如果你要改成按钮权限过滤,则需要修改成如下
/// <summary>
/// 读取ListDto的数据模型
/// </summary>
/// <returns></returns>
[HttpGet]
public async Task<VoloModelInfo> ReadListModel()
{
//var buttons = new List<ButtonRoleModel> { new ButtonRoleModel { Path="AreaInfoListDto",Code="root1" }, new ButtonRoleModel { Path = "AreaInfoListDto", Code = "root2" } };
//var _model = PasteBuilderHelper.AttributeReadModelProperty2(new AreaInfoListDto(), buttons);
var _model = PasteBuilderHelper.AttributeReadModelProperty2(new AreaInfoListDto(), await base.CurrentButtonsAsync());
var _query_model = PasteBuilderHelper.AttributeReadModelProperty(new InputQueryAreaInfo());
if (_query_model != null)
{
_model.QueryProperties = _query_model.Properties;
}
return _model;
}
关键点在函数AttributeReadModelProperty2的调用
传入的buttons
这里有几个约定!
如果你传入null表示不启用按钮权限过滤,也就是全部放行!
如果你要传入说,当前用户没有权限,则你应该传入空数组而不是null
需要实现按钮权限显示,你在[PasteMenu] [PasteIfMenu] [PasteButton] 中,传入btnCode,表示按钮值
如果不传入btnCode表示不启用过滤,也就是全部放行!
///<summary>
///地区数据
///</summary>
[Description("地区数据")]
[PasteEnable(0, 1, 1, 1)]
[PasteButton("动态新增", "tap_add_form(this)", "add", btnCode: "admin")]
[PasteButton("完善全名称信息", "func_area_fullname()", "", "", btnCode: "admin2")]
[PasteButton("载入数据", "global_load_area_data()", "", "重新载入地区原始数据", btnCode: "admin")]
[PasteButton("备份数据", "global_backup_area_data()", "", "保存现有的地区数据")]
public class AreaInfoListDto : EntityDto<long>
{
}
注意看我上面的
那么在权限列表的时候怎么配置的呢?
路径就是上面案例中的Path,你也可以用表示所有
权限就是,上面特性配置的btnCode,当然,也支持表示所有
权限中配置按钮的作用,就是最终读取给当前用户的buttons
我们都知道,像新增,编辑,详细,删除等都是默认按钮,其中新增按钮最为特殊!
如果你要把新增按钮改成可控制的,你需要
[PasteEnable(0, 1, 1, 1)]
[PasteButton("动态新增", "tap_add_form(this)", "add", btnCode: "admin")]
不知道你是否还记得[PasteEnable]
表示的意思是,是否启用,新增,编辑,删除,详细,设置为1表示启用,设置为0表示禁用,
上面的意思就是先禁用系统默认的!
然后在设置
[PasteButton("动态新增", "tap_add_form(this)", "add", btnCode: "admin")]
这里面的add就是对应的新增默认按钮,而函数tap_add_form就是新增的点击事件,照着写就行了!
注意
!!上面的这2个的特性顺序不能变,先禁用,然后配置,配置了add后会启用按钮,关键点在于btnCode引入了权限!!
至于表格中的编辑,详细,删除按钮,那就全部禁用,然后自行实现即可,比如
/// <summary>
/// 删除
/// </summary>
[PasteHidden]
[PasteMenu("删除", "handler_tap_del(this)", btnCode: "del")]
public int Menu1 { get { return 0; } }
注意
如果给[PasteMenu]配置了btnCode,在他上面要标记[PasteHidden],
因为前端是找到了PasteMenu的时候,才把对象隐藏的,如果没有权限,则直接返回Menu1了,会被当前表格的列处理了!
[PasteIfMenu]同理!!!
由上,是否发现使用PasteApeart要实现按钮权限控制显得非常简单,也符合PasteApeart的宗旨“All in Dto”!
只需要在Dto中写一两行代码,即可实现基于用户的权限控制!!!
注意这里的操作,只是针对管理端,如果用户F12自己修改了,还是能调用的,所以安全问题不在前端,而在后端!
也就是后端还是要进行权限控制的!!!
如果是有AppService的接口可以配置权限,那么如果使用DefaultAppService的如何控制权限呢?
请查看[PasteAuth]特性,就是专门为DefaultAppService的权限控制的!!!
12345
贴代码
贴代码
随风
不用选,后面都是PasteApeart,他们其实是一个东西
看版本,PasteApeart.Helper 26.9.2之后,就按照基类前面的顺序了,也符合阅读顺序,当然你可以使用PasteSort再次改变他!
1.语言吧,这本身只是一个开发思想,其实其他语言也可以用,不过最优雅实现的还是.NET
2.特别适用于需要表单,表格的系统,所以哪些EMS,CRM,ERP等都合适
3.扩展,比如这个思想,你也可以应用于C/S,理论上也是可以的
4.这个主要针对的是管理端,附带UI的CRUD,也就是说对于业务代码,是没影响的!
5.可能入门会麻烦点,毕竟有接近100个PasteXXXX特性要了解,幸运的是都是Paste开头,官方的也支持,比如MaxLength,Required等!