PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管理端只有Html+js版本的,后续将支持小程序,Vue等
案例源码在
https://gitee.com/pastecode/paste-template
不定期升级
通过引入PasteForm,一个项目哪怕100个数据表,一般的管理页面也才不到10个,除非有非常多的特殊功能,否则都能用PasteForm中的表格和表单来实现!
本次的特性介绍,涉及的东西会多一些,你可以下载源码后,看看详细的,我们先来查看下各个特性的信息
了解了PasteForm的理念之后,会发现一个数据模型,比如UserInfo,对应的Dto一般有4个
UserInfoAddDto
UserInfoUpdateDto
UserInfoDto
UserInfoListDto
比如说字段UserHead,会出现在上面的4个Dto中,由于特性信息,我们需要在这个UserHead字段上添加特性[PasteImage]
如下片段:
/// <summary>
///
/// </summary>
public class UserInfoAddDto
{
///<summary>
///用户名
///</summary>
[MaxLength(32, ErrorMessage = "用户名过长,不能超过32位")]
[Required(ErrorMessage = "用户名不能为空")]
public string UserName { get; set; }
/// <summary>
/// 用户头像
/// </summary>
[MaxLength(128)]
[PasteImage]
public string UserHead { get; set; }
//其他字段
}
/// <summary>
///
/// </summary>
public class UserInfoDto : EntityDto<int>
{
///<summary>
///用户名
///</summary>
[MaxLength(32)]
public string UserName { get; set; }
/// <summary>
/// 用户头像
/// </summary>
[MaxLength(128)]
[PasteImage]
public string UserHead { get; set; }
//其他字段
}
/// <summary>
///
/// </summary>
public class UserInfoListDto : EntityDto<int>
{
///<summary>
///用户名
///</summary>
[MaxLength(32)]
public string UserName { get; set; } = "unknow";
/// <summary>
/// 用户头像
/// </summary>
[MaxLength(128)]
[PasteImage]
public string UserHead { get; set; }
//其他字段
}
/// <summary>
///
/// </summary>
public class UserInfoUpdateDto : EntityDto<int>
{
///<summary>
///用户名
///</summary>
[MaxLength(32, ErrorMessage = "用户名过长,不能超过32位")]
[Required(ErrorMessage = "用户名不能为空")]
public string UserName { get; set; }
/// <summary>
/// 用户头像
/// </summary>
[MaxLength(128)]
[PasteImage]
public string UserHead { get; set; }
//其他字段
}
而有时候,比如文章的表ArticleInfo,里面有一个字段body表示文章内容,这个时候我们就希望在ArticleListDto的地方不显示body这个字段,比如CreateDate表示创建时间,这种字段我们希望他不应该出现在AddDto,和UpdateDto字段中!
所以说一个项目中,往往有非常多的表,每个表都有不一样的字段,在生成对应的Dto的时候,如果用手打代码,磨洋工的话将会非常耗时,为此我们提供了PasteBuilder代码生成器!!!
也就是你只要为当前项目修改好config.json配置文件后,写一个数据表对应的数据模型然后右键生成代码,即可生成需要的不同Dto和DDD等的代码,
下载地址
https://soft.pastecode.cn/Home/Soft
下载后,解压,双击安装!
下载最上面的项目模板,或者是基于项目模板创建新的项目,可以在XXX.Domain下找到文件夹template
这个文件夹的内容是代码生成器相关的配置或者模板文件,注意阅读文件夹下的readme.md文件。
以下以我的项目SmartTool项目为例,打开项目后,在SmartTool.Domain的template文件夹下有config.json文件,内容如下
{
"readme": "这个是后续支持的,目前处于思路阶段,表示代码生成器的一些配置,比如字段隐藏,字段的属性直接填充等",
"readme1": "基于配置,最后在带入模板的时候把信息组合好,这样模板页上就只需要处理数据,而不要再进行判断等!",
"readme2": "ignore配置的是对应的dto中是否不显示这个字段,就是就应的model中是否不显示这个字段,默认字段都是显示的",
"readme3": "all表示对所有的表都生效,其他的注意是区别大小写的,属性中也区分dto的!!!",
"readme4": "dto支持5个模式all,add,update,detail,list,其中all表示包含后面的4种",
"version": "1.0.0",
"ignore": { //忽略哪些字段?
"all": {
"add": [ "CreateDate", "AdminUid", "CreateUid" ],
"update": [ "UpdateDate", "CreateDate" ],
"detail": [ "UpdateDate", "CreateDate" ],
"list": [ "Body", "Content", "Context" ]
},
"other": {
"UserInfo:add": [ "DelColumn" ] //表示表示这个表的这个add模式下,删除这个字段DelColumn
}
},
"attribute": {
"ignore": [ "Comment", "Display", "Decription", "Index", "DefaultValue", "Column", "NotMapped" ], //表示忽略哪些来自Domain的属性
"all": {
"UserId": "[ColumnDataType(\"outer\",\"userInfo\",\"extendUser\",\"id\",\"userName\")]" //表示这个字段UserId需要添加这个过滤器多个之间用::隔开 示例:[PasteLeft]::[PasteHidden]
},
"other": {
"UserInfo:list:userName": "[PasteClass]", //表名称 示例:[PasteClass]::[PasteHidden]
"*:add:mark": "[PasteClass]"//新版本支持
}
}
}
然后我创建一个表model,命名为BuildTestModel(SmartTool.Domain/testmodels文件夹下),代码如下:
namespace SmartTool.testmodels
{
/// <summary>
/// 测试表
/// </summary>
public class BuildTestModel:Entity<int>
{
/// <summary>
/// 字段1 这个保持默认
/// </summary>
public int Vid { get; set; }
/// <summary>
/// 字段2 这个要在adddto和updatedto中不显示
/// </summary>
public int Create { get; set; }
/// <summary>
/// 字段3 这个要配置listdto中不显示
/// </summary>
public string Body { get; set; }
/// <summary>
/// 字段4 这个要配置[PasteTextarea]
/// </summary>
public string Desc { get; set; }
}
}
针对上面的说明,我们把配置文件修改如下
配置文件已经修改好了,我们保存后,右键BuildTestModel.cs
按照上图的,点击二级菜单的最上的选项“完整生成(DTO.EF.API.HTML)”
等待执行完成后,去SmartTool.Application.Contracts下的testmodels文件夹下,可以看到新生成的文件
内容如下:
namespace SmartTool.testmodels
{
///<summary>
///测试表
///</summary>
public class BuildTestModelAddDto
{
///<summary>
///字段1 这个保持默认
///</summary>
public int Vid { get; set; }
///<summary>
///字段3 这个要配置listdto中不显示
///</summary>
public string Body { get; set; }
///<summary>
///字段4 这个要配置[PasteTextarea]
///</summary>
[PasteTextarea]
public string Desc { get; set; }
}
///<summary>
///测试表
///</summary>
public class BuildTestModelUpdateDto:EntityDto<int>
{
///<summary>
///字段1 这个保持默认
///</summary>
public int Vid { get; set; }
///<summary>
///字段3 这个要配置listdto中不显示
///</summary>
public string Body { get; set; }
///<summary>
///字段4 这个要配置[PasteTextarea]
///</summary>
[PasteTextarea]
public string Desc { get; set; }
}
///<summary>
///测试表
///</summary>
public class BuildTestModelDto:EntityDto<int>
{
///<summary>
///字段1 这个保持默认
///</summary>
public int Vid { get; set; }
///<summary>
///字段2 这个要在adddto和updatedto中不显示
///</summary>
public int Create { get; set; }
///<summary>
///字段3 这个要配置listdto中不显示
///</summary>
public string Body { get; set; }
///<summary>
///字段4 这个要配置[PasteTextarea]
///</summary>
[PasteTextarea]
public string Desc { get; set; }
}
///<summary>
///测试表
///</summary>
public class BuildTestModelListDto:EntityDto<int>
{
///<summary>
///字段1 这个保持默认
///</summary>
public int Vid { get; set; }
///<summary>
///字段2 这个要在adddto和updatedto中不显示
///</summary>
public int Create { get; set; }
///<summary>
///字段4 这个要配置[PasteTextarea]
///</summary>
[PasteTextarea]
public string Desc { get; set; }
}
///<summary>
/// 查询
///</summary>
public class InputQueryBuildTestModel:InputSearchBase{
}
}
看上面的代码,符合配置!
所以在使用PasteForm的时候,有很多小技巧可以使用的
1.字段名,尽量使用一样的字段名称,这样可以最大程度的利用配置,也减少后续添加特性的时候写错
2.规划好字段,某些字段表示啥意思,比如创建时间,更新时间,可以修改对应的模板文件生成,参考XXX.Domain/template/文件夹下的说明
3.Dto支持多级继承,比如UpdateDto:AddDto,Dto:ListDto:ShortDto等,注意这样的继承最多支持3级,否则在使用PasteForm的时候,文档输出有问题!
4.前期好好规划个个数据库表对应的数据模型,特别是外表等的配置,后续直接生成代码可以节省非常多的时间
5.好好利用代码生成器模板的原理,你甚至可以基于模板原理编写生成VUE,自己的DDD等!
更多特性见
我们下期见!