PasteForm我更喜欢称她为一个思想
All In Dto !
特性利用反射的原理,反射Dto中的特性和字段信息,把信息规范后提供给管理端,管理端基于信息生成对应的表单和表格,甚至图标信息!
下载源码后,使用VS2022打开,大概看到如下图
注意看上图的文件结构,其实主要的是子项目,像dynamicmodels,newsmodels,testmodels,usermodels都是案例模块,你不需要的话大可直接删除,注意几乎的子项目都有对应的模块文件夹,一切的源头在于Domain子项目!
管理端文件在PasteForm.HttpApi.Host子项目的wwwroot文件夹中
源码打开后,等待VS2022自动加载nuget包等,然后进行以下步骤
1.设置PasteForm.HttpApi.Host为启动项目
2.如上设置后,在6的位置输入
add-migration init_database -Context SqliteDbContext
3.启动运行项目
(默认就是配置的sqlite模式,所以可以直接运行,默认端口是22222)
http://localhost:22222/page/index.html
如果运行后,提示404,则是管理端文件没有复制到对应的文件夹,你可以手动或者是使用链接模式,主要是把上面说的wwwroot文件夹复制到bin\Release\net6.0\中,如果你升级到net8.0那就是在对应文件夹中,然后重新访问
使用默认账号密码登录后,即可进入管理端
菜单中的,案例表,新增,看到如上表单!
在项目PasteForm.Domain中,有一个文件夹尤为重要,他就是template
里面有
你只要关注上面的几个文件即可,其他的是历史文件了!
我们以案例中的TestTable这个Model为案例
创建表,由于我们使用的是EF的Code First所以第一步就是创建数据库表对应的Model,这里是TestTable
using System;
using System.ComponentModel.DataAnnotations;
using PasteFormHelper;
using Volo.Abp.Domain.Entities;
namespace PasteForm.testmodels
{
/// <summary>
/// 测试表 用于测试CURD的表
/// </summary>
[PasteShortModel("TestShort", "ToTestShort", "Id", "Name")]
public class TestTable : Entity<int>
{
/// <summary>
/// 姓名 模拟短文本输入
/// </summary>
[Required]
[MaxLength(16)]
public string Name { get; set; }
/// <summary>
/// 头像 模拟图片上传
/// </summary>
[MaxLength(128)]
[PasteImage(1, "head", "120*120")]
public string Head { get; set; }
/// <summary>
/// 年龄 模拟输入number
/// </summary>
[PasteUnit("周岁")]
public int Age { get; set; }
/// <summary>
/// 会员周期 会员生效区间
/// </summary>
[PasteDaterange("dateStart", "dateEnd")]
public DateTime DateStart { get; set; }
/// <summary>
/// 会员周期 会员生效区间
/// </summary>
[PasteHidden]
public DateTime DateEnd { get; set; }
/// <summary>
/// 余额 数据库是分为单位,UI中是以元为单位
/// </summary>
[PasteFenToYuan]
public int Balance { get; set; }
/// <summary>
/// 用户
/// </summary>
[PasteShort("UserInfo","ExtendUser","ToUserShort()")]
public int UserId { get; set; }
///// <summary>
///// 更多 外表模式,需要修改对应的dto.txt和server.txt模板代码,关键判断bool_other_model
///// </summary>
//public IncludeTable More { get; set; }
}
}
先别管这个表是干嘛的,其实我上面的字都都是为了做案例,主要是看我标注的特性!
上一步中的信息编写保存完成后,我们可以右键这个文件,然后执行PasteBuilder=》代码生成,则他将在以下地方创建文件或内容!
/// <summary>
/// 测试表 用于测试CURD的表
/// </summary>
public DbSet<TestTable> TestTable { get; set; }
在XXXXXXXXCreatingExtensions.cs文件中创建 //**TestTable**
builder.Entity<TestTable>(b =>
{
b.ToTable(options.TablePrefix + "TestTable", options.Schema);
b.ConfigureByConvention();
});
/// <summary>
/// 测试表 用于测试CURD的表
/// </summary>
public static TestShort ToTestShort(this TestTable input)
{
if (input != null)
{
return new TestShort
{
Id = input.Id,
Name = input.Name
};
}
else
{
return null;
}
}
// #TestTable#
CreateMap<TestTable, TestTableListDto>();
CreateMap<TestTable, TestTableDto>();
CreateMap<TestTable, TestTableUpdateDto>();
CreateMap<TestTableUpdateDto, TestTable>();
CreateMap<TestTableAddDto, TestTable>();
从上面的信息可知,其实新增文件的只有2个地方,一个是XXXDto.cs两外一个就是XXXAppService.cs,这2个文件的生成内容是按照PasteForm.Domain/template文件夹中的dto.txt和server.txt
如果你要生成不一样的代码,则可以查阅readme.md的介绍,基于liquid的模板写法自己修改模板内容!
参考资料
http://dotliquidmarkup.org/
[https://shopify.github.io/liquid/tags/template/](https://shopify.github.io/liquid/tags/template/ "https://shopify.github.io/liquid/tags/template/")
上面说了PasteForm只是一个思想,贴代码提供了一个实际案例!
既然都是Dto的干活,那么肯定需要一些工具来辅助这个Dto,否则实现起来还是很麻烦的!
案例项目基于ABP框架
假设项目为Projectb
Projectb.Domian
Projectb.Application.Contracts
Projectb.EntityFramework
Projectb.Application
Projectb.HttpApi.Host
我在上面的基础上引入了一个新的子项目Projectb.Handler,作用就是承载业务代码,
这样Applciation和HttpApi.Host都可以引用!
要我概括的话,就是你可以把他们看成不同的文件夹,为了把东西规范点存放而已!
一个代码生成器,一个VS2022的右键代码生成器,专门针对PasteForm而开发,可以做到一键生成相关代码,你只需要重新生成项目,确定引用啥的没问题即可运行项目!!!
开源代码在这:https://gitee.com/pastecode/paste-builder
主要针对mark特性设计的在线文档,为了让使用管理端的用户可以“哪里不会点哪里”而设计!
开源代码在这:https://gitee.com/pastecode/paste-document
代码编写完成后,如果你要部署到服务器上,可以使用PasteSpider进行部署,支持Windows/Linux服务器,支持让你的服务以podman/docker/iis/Windows.Service/Linux.Systemd的方式运行!