这个一般用于显示object对象中的某一个字段,比如如下代码
在ListDto中用于显示某一个object类型的字段
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 字符 | name | 显示当前字段的某一个子字段,默认为name |
///<summary>
///角色绑定权限
///</summary>
[PasteDisable(true, true)]
public class GradeRoleListDto : EntityDto<int>
{
///<summary>
///角色ID 点击选择角色
///</summary>
public int GradeId { get; set; }
/// <summary>
/// 角色
/// </summary>
[PasteDisplay]
public GradeShortModel ExtendGrade { get; set; }
///<summary>
///权限ID 点击选择权限
///</summary>
public int RoleId { get; set; }
/// <summary>
/// 权限
/// </summary>
[PasteDisplay("name")]
public RoleShortModel ExtendRole { get; set; }
}
看上面的Dto,主要是我这个刚好GradeShortModel的显示是name这个字段,所以可以省略
隐藏,其实我一直很想改成hide。。。或许后面会做兼容!
这个就是隐藏这个字段,
这个有点像jsonignore
也就是提交的时候这个字段不会回传的,所以要注意!!!
在view.html中,也就是表单页面中,表示不渲染这个对象,响应的在提交数据的时候也没有这个对象!!!
表示隐藏这个字段,一般是主键ID,或者外表链接过来的会这配置,比如需要给cate添加子项,则添加由cate那边过来
这个也适用于ListDto
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 字符 | bind | 如果不填表示隐藏,如果填写了表示页面的query中model=xxx的时候不隐藏,表示非xxx的时候隐藏,xxx的时候不隐藏 |
这个特性一般用于表格显示的时候,也就是index.html页面,这个页面有几种模式(query中model=xxx)
默认模式,不填也是这个模式
模式,就是outer特性的时候,最后一列是选择的时候
这个模式一般是绑定关系的时候,比如从角色列表中,找到一个角色,然后给这个角色绑定权限,那么逻辑上就是打开权限列表页面,如果已经绑定这个角色了的,则switch就是打开状态,否则就是关闭状态,这个时候role的页面就是bind模式!
这个hidden有时候可以被唤醒,就是会显示出来!
在changeui中,会基于当前字段的值进行显示隐藏
具体的查看功能类!
那么有没有一个不显示出来的呢?
hide
其实hidden可以看成是readonly的隐藏款,因为在表单提交的时候是会提交这个对象的!!!
这个特性只用于表单的时候
和hidden很像对吧!
不过他们还是有区别的
empty会占位
而hidden不会占位
比如以下信息
///<summary>
///网关配置 为不同项目的不同环境配置不一样的IP网段
///</summary>
public class BindProjectNetworkAddDto
{
///<summary>
///项目 对哪个项目生效
///</summary>
[ColumnDataType("outer", "projectInfo", "extendProject", "id", "name")]
[PasteMark]
[PasteRequired]
public int ProjectId { get; set; }
/// <summary>
/// 占位
/// </summary>
[PasteEmpty]
public int Menu1 { get; set; }
///<summary>
///服务器 在哪一台服务器上生效
///</summary>
[ColumnDataType("outer", "linuxInfo", "extendLinux", "id", "name")]
[PasteMark]
[PasteRequired]
public int LinuxId { get; set; }
/// <summary>
/// 占位
/// </summary>
[PasteEmpty]
public int Menu2 { get; set; }
///<summary>
/// 网关地址 示例:192.168.1.0/16
///</summary>
[MaxLength(24)]
[PasteMark]
[Required(ErrorMessage ="网关地址不能为空,请重新输入 示例 172.5.1.0/16")]
[RegularExpression("^(192|172)(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){2}(\\.0/16)$", ErrorMessage = "{0}输入格式错误,192|172打头0/16结尾,示例:192.168.5.0/16")]
public string Gatway { get; set; }
/// <summary>
/// 占位
/// </summary>
[PasteEmpty]
public int Menu3 { get; set; }
}
看上面,其实Menu字段的都是无效字段,为了占位用而已,不然这个表单就很少内容了
就三个字段,占2行,第一行2个字段,第二行一个字段
通过添加empty字段后,就变成三行了
每行开头一个有效字段,第二列的字段都是空的
效果如下
如上,那么问题来了,如果我需要每一行之间空一个空位咋办???
有些时候,我们希望显示某些内容,不希望用户可以修改
这个时候我们可以给这个字段上一个特性
readonly
这个特性的作用就是给组件上readonly,所以需要对应的组件支持这个特性!
比如text textarea richtext等都是支持的!
注意提交数据的时候,服务端需要做判断,否则用户可以通过F12进行修改后提交!!!
/// <summary>
/// 文本 这个可以编辑
/// </summary>
[PasteText]
public string Name1 { get; set; }
/// <summary>
/// 文本 这个不能编辑
/// </summary>
[PasteText]
[PasteReadOnly]
public string Name2 { get; set; } = "给你看看";
上面的代码在UI上为
后面这个点击后没有输入焦点,不让修改,
样式上暂时的需求是不需要不同,你也可以为readonly配置不一样的样式,比如有点灰色的背景色!
看到上面我就知道有个BUG了,readonly应该不要给他删除按钮!!!
这个表示编写html代码,所以一般用于表格页面
如果要显示自定义的表格,则使用这个,表示直接显示信息模板注意里面的带参使用{{:=item.name}}这样的形式
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 字符 | <div><span>{{:=item.name}}</span><span>{{:=item.desc}}</span></div> | 需要在td中显示的html代码,支持模板的写法 |
比如说案例项目的权限列表页面
效果如下
看特别是名称这一列,这一列肯定是html干活的,我们看下这个特性是如何写的
///<summary>
///权限列表
///</summary>
[PasteLinkQuery("fatherId")]
[PasteButton("备份", "global_role_output(this);")]
[PasteButton("恢复", "global_role_default(this);","","grady")]
public class RoleInfoListDto
{
/// <summary>
/// ID
/// </summary>
[ColumnDataType("orderby", "Id", "Id desc")]
public int Id { get; set; }
///<summary>
///名称
///</summary>
[PasteClass]
[ColumnDataType("html", "<div class=\"level level{{:=item.level}} role{{:=item.roleTypeInt}}\">{{ if(item.icon){ }}<i class=\"Hui-iconfont {{:=item.icon}}\"></i>{{ } }} {{:=item.name}}</div>")]
public string Name { get; set; }
}
这个特别适合于自定义一些样式等!
表示这个字段在表格得宽度,可以为*或者对应得数字,是表格得列的宽度的权重,这个适用于ListDto
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 字符 | 60 | 表示这个列的宽度,可以为数字也可以是*比如3*这样 |
表格数据展示的时候显示宽度用
针对一些特殊的设定,比如textarea,有些地方我们要设置高一些
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 字符 | height:500px; | 就是style里面的内容 |
其实就是style里面的代码部分,注意一个项是以;结尾的
针对一些自定义的class,可以通过这个来配置
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 字符 | btngo | 表示这个对象要添加的class |
可以理解为为表单字段设定class名称
默认调用的是fleft表示内容做停靠!
这个主要是给chart使用的,默认表格是table,也就是列表页面支持table和chart模式
chart就是图表有line,bar模式的,目前采用的是echarts的组件
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 字符串 | table | 首显方式table就是默认的表格形式 |
args2 | 字符串 | chart | 备选方式 |
args1 | 字符串 | ||
args1 | 字符串 |
如果args2不填写,则UI中不会出现用户可以切换的按钮!
args1写哪个,哪个就是默认显示的方式
如果query有,比如show_type=chart,而args1又为table
则chart生效!!!
和这个相关的还有
charty
chartx
chartseries
X轴
一般表示时间
如上图所示,下面哪一行的就是chartx,在图中表示时间轴
参数 | 类型 | 示例 | 备注 |
---|---|---|---|
args1 | str | 时间 | X轴的名称,貌似好像没用 |
args2 | str | 备用 | 备用 |
args3 | str | 备用 | 备用 |
args4 | str | 备用 | 备用 |
注意一个Model里面只能有一个为chartx,有且只能有一个!
Y轴?
我的理解Y轴柱
上图的左侧的成绩多少分,右侧的身高多少cm
这个特性是标注在Class上的
按照标注顺序有序标0开始
比如上图的,可能成绩有语文,数学,英语,身高
那么语文,数学,英语就用左边柱子的刻度
身高单独用右边的刻度!
参数 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | str | 成绩 | 显示名称,比如上面的成绩,身高 |
args2 | str | left | 柱子放置位置,left左侧,right右侧 |
args3 | int | 0 | 偏移量 |
args4 | str | {value}cm | 格式化显示 |
那么接下来的就是数据轴了,请看chartseries
数据轴,上面案例说的 语文 数学 英语 身高的具体数值!
就是主视图区域的柱子bar或者线段line
参数 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | str | line | line线段线条模式bar柱子形式 |
args2 | int | 0 | 用之前的charty的哪一根,注意和顺序有关 |
args3 | str | 标题 | 语文 |
args4 | str | 备用 | 备用 |
我的理解args3就是legend,最中间上面那个!
上面的几个特性介绍了图表,我们来看下上面图片的额Dto的配置是怎么样的
///<summary>
///测试表 用于测试CURD的表
///</summary>
[PasteBatch("批量启用", "global_bitch_state(this,1)")]
[PasteBatch("批量禁用", "global_bitch_state(this,0)")]
[PasteUI("chart","table")]
[PasteCharty("成绩","left",0,"{value}分")]
[PasteCharty("身高","right",0,"{value}cm")]
//[ColumnDataType("button","新增新增","open_window('新增','./view.html?path=xxx')","add")]
public class TestTableListDto : EntityDto<int>
{
///<summary>
///姓名 模拟短文本输入
///</summary>
[ColumnDataType("edit", "view")]
public string Name { get; set; }
///<summary>
///头像 模拟图片上传
///</summary>
[ColumnDataType("image")]
public string Head { get; set; }
///<summary>
///年龄 模拟输入number
///</summary>
[PasteMark]
[PastePrefix("多少")]
[ColumnDataType("edit","view")]
[PasteUnit("周岁")]
public int Age { get; set; }
/// <summary>
/// 金额
/// </summary>
[PasteFenToYuan]
[PastePrefix("¥")]
[ColumnDataType("edit", "view")]
[PasteUnit("元")]
public long Val1 { get; set; } = 1600;
///<summary>
///文本区域 模拟文本区域的输入
///</summary>
[ColumnDataType("class", "fleft")]
[PasteMark]
[ColumnDataType("edit", "view")]
public string Desc { get; set; }
/////<summary>
/////富文本 模拟富文本,前端HTML的是使用wangEditv5
/////</summary>
//public string Blog { get; set; }
/// <summary>
/// 开关
/// </summary>
[PasteSwitch("",true)]
public bool IsOpen { get; set; }
/// <summary>
/// 开关
/// </summary>
[PasteSwitch("", false,"handlerClose")]
public bool IsClose { get; set; }
///<summary>
///加入日期 模拟必填时间的输入
///</summary>
[ColumnDataType("edit","view")]
[ColumnDataType("chartx")]
public DateTime JoinDate { get; set; }
///<summary>
///更新日期 模拟非必填的时间输入
///</summary>
[ColumnDataType("hidden")]
public DateTime? UpdateDate { get; set; }
/////<summary>
/////单选 一般表示状态,内定的,有点像Enum,关于Enum后续会支持
/////</summary>
//[ColumnDataType("html", "<div>{{:=item.dateType}}-{{:=item.gradeId}}</div>")]
//public int DateType { get; set; }
/// <summary>
/// 时间类型
/// </summary>
[ColumnDataType("select", "[{\"name\":\"日类型\",\"value\":0},{\"name\":\"月类型\",\"value\":1},{\"name\":\"年类型\",\"value\":2}]")]
[ColumnDataType("edit","view")]
public int DateType { get; set; }
/// <summary>
/// 给DateType编辑的时候使用,记得要赋值
/// </summary>
[PasteHidden]
public List<SelectIntItem> DateType_expend_select_values { get; set; }
/// <summary>
/// 类型显示
/// </summary>
[ColumnDataType("html", "<div class=\"dtype{{:=item.dateTypeInt}}\">{{:=item.dateType}}-{{:=item.dateType}}</div>")]
public int DateTypeInt { get { return DateType; } }
///<summary>
///角色ID 这里一般用于外表,就是选择其他表的一个数据作为输入内容
///</summary>
[ColumnDataType("hidden")]
public int GradeId { get; set; }
///<summary>
///成绩1 模拟前端限定2位小数
///</summary>
[ColumnDataType("edit", "view")]
[ColumnDataType("chartseries")]
public double Score { get; set; }
///<summary>
///成绩2 模拟前端限定2位小数
///</summary>
[ColumnDataType("chartseries")]
public double Score2 { get; set; }
///<summary>
///身高 模拟前端限定2位小数
///</summary>
[PasteChartseries("bar",1)]
public double Score3 { get; set; }
/// <summary>
/// 普通菜单
/// </summary>
[ColumnDataType("menu", "菜单一", "open_window('查阅用户带参','./pasteform/index.html?path=userInfo&xxid={{:=item.id}}');", "Hui-iconfont-menu")]
public string Menu2 { get; set; }
/// <summary>
/// 普通条件菜单
/// </summary>
[ColumnDataType("ifmenu", "item.age==7", "<a href=\"javascript:;\" onclick=\"open_window(`111`,`./pasteform/index.html?path=userInfo&goid={{:=item.id}}`)\">条件1</a>", "")]
public string Menu3 { get; set; }
/// <summary>
/// 菜单盒子菜单
/// </summary>
[ColumnDataType("menu", "菜单二", "open_window('查阅用户带参','./pasteform/index.html?path=userInfo&xxid={{:=item.id}}');", "Hui-iconfont-menu", "box")]
public string Menu5 { get; set; }
/// <summary>
/// 菜单盒子中的条件菜单
/// </summary>
[ColumnDataType("ifmenu", "item.age==8", "<a href=\"javascript:;\" onclick=\"open_window(`222`,`./pasteform/index.html?path=userInfo&goid={{:=item.id}}`)\">条件2</a>", "box")]
public string Menu4 { get; set; }
/// <summary>
/// 详细
/// </summary>
[ColumnDataType("menu", "详细", "open_window('查看{{:=item.id}}详细','./pasteform/detail.html?path=testTable&id={{:=item.id}}');", "Hui-iconfont-menu")]
public string Menu6 { get; set; }
}
可以看到要以图表形式显示,依然简单,只需要打几个特性即可!!!
本来不引入这个的,但是在最新的一个项目中遇到如下问题!
假设有一个字段
my_stype
值有1,2
当值为1的时候,我希望 regexp:myrole 的显示,也就是不为1的时候 regexp:myrole 隐藏!
注意看上面,myrole更多的是一个类,因为单个没必要用正则regexp,假设他里面有10个字段,有些字段我不希望显示(某些地方要使用long类型,而前端我希望使用datetiem形式显示,那就有了api提交后,由服务端进行转换,所以这个时候hide就有必要了!)
之前也在考虑是否要引入jsonignore这个特性(官方就有了)
这个特性有点特殊,估计后续会引入!
数据隐藏不是直接去除这么简单,比如
user_id
userinfo
这个时候userinfo往往是为了给user_id提供UI的支持的,比如你选中的是10021233这个用户,显示一串数字肯定不合适的,通过比如outer特性,可以读取到显示为张三李四,这样会不会更好!!
changeui不会唤醒hide
hide不会在UI中有渲染或dom
提交的时候hide等效于jsonignore,不会提交给api端!