在之前的文章中说明了我心目中的CRUD的思路,后面也付出了实际,写了一个案例项目PasteTemplate,后面也在实际项目中(贴Builder(PasteSpider)和贴代码(PasteSoft))
在实际项目中对案例项目进行了新的改动,主要是实现一些实际项目中的需求,比较不能用于实际项目的框架是没有意义的!
案例项目基于ABPvNext的框架的简略版本,只保持了XXX.Domain,XXX.Application.Contracts,XXX.EntityFrameworkCore,XXX.Application,XXX.HttpApi.Host然后我在这个的基础上加了一个子项目XXX.Handler,为了便于开发可以下载PasteBuilder作为这个项目的右键代码生成器,这个生成器是一键生成的,不必这里复制代码,哪里复制代码!
XXX.Handler:作为XXX.Application.Contracts之后,在XXX.Application之前,主要作用是用于聚合业务需求
比如用户模块,包含了角色,权限,账号,找回密码,新建账号等,全部聚合到UserHandler中,而这个UserHandler可以被XXX.Application和XXX.HttpApi.Host中调用,这里XXX.Application比较好理解,WebApi主要的代码就放这里,而XXX.HttpApi.Host中就有很多代码可以实现了
1.比如引入Channel可以把代码写入到HostedService中,这样就实现了本地的消息队列和队列处理,
2.如果有引入RabbitMQ则还可以作为消费者,
3.再者在系统初始化的时候,可以作为内置菜单和默认账号的写入
4.还可以为一些特殊的接口提供服务,比如有些三方接口等
这个是贴代码专门为PasteTemplate模板项目创建的右键代码生成器,就是VS2022的插件,安装后,后续在项目中添加新的表,只要在XXX.Domain中对应的模块添加表的Model,然后右键生成代码,就会在对应的EF,Application等地方写入代码,然后右键重新生成解决方案,理论上是直接生成成功的,然后自己去执行add-Migration生成对应的迁移代码!
本次项目改动比较大,之前也是有发布PasteTemplate做为项目模板,啥叫项目模板?就是你自己写一个项目,把一些基本的轮子等写好,然后打包成项目模板,后续要开发新的项目,选择这个项目模板即可生成新的项目,好处就是新的项目不要再次搭建基础轮子了,然后是项目的命名,文件的命名等都是新的,我看很多人是找旧的项目复制出来,然后各种重命名,各种删除不要的代码!
新的登陆页面将采用统一的,说白点后续的项目,可以说前端(管理端)几乎不要修改代码,只要改动项目的后端代码即可,所以登陆页面作为很重要的一部分!
登陆页面没啥改动哈,主要是样式,然后引用动效!接口地址主要在/api/app/User/xxx中
作为管理端的首页,相信几乎的项目是一样的,那就是菜单页面和工作台,PasteTemplate的管理端首页如下
左侧菜单采用动态的模式,菜单由权限读取,系统在首次启动的时候会把默认的菜单写入到数据库,如果当前账号有root-root的权限,则会返回所有的菜单,也就是root-root表示超级权限的意思,拥有系统的所有权限!
作为本次的主角,也就是CRUD的实现,PasteForm表示的是3个页面组成的模块
表单页面的主页面,数据显示列表的页面,按照下图为例
主要包含几个区域
1.上方的搜索区域,这个搜索区域一般由InputQueryXXXModel控制,动态的,也就是由后端的InputQueryXXXModel或者是默认的InputSearchBase的对象控制,包含的功能有
a.外表输入,比如你要输入某一个表的ID作为查询条件,如上图的搜索某一个权限作为父级去搜索他的子集,操作方式点击后会弹出选择页面,选择后会把id赋值个这个搜索输入框,显示的是名称字段,传值是ID字段,这两个字段可以配置的,使用的属性为outer
b.选择框,可以配置多个选择项中选择其中一个,比如按照状态查询,则一般有全部状态,可用状态,禁用状态!这个要看对应字段的属性配置决定的,使用的属性为select
c.多选框,对应选择框,其实就是选择框的多选模式,接收的方式要看字段的类型,比如你可以回传123,124,也可以回传[123,124]等,这个也是基于配置的,使用的属性为selects
d.参数来源,有时候当前页面是其他页面传递过来的,比如给某一个角色绑定权限,那么这个时候当前页面附带的参数一般为gradeid,表示页面显示的内容是基于参数gradeid进行查询权限列表的,这个时候,如果当前页面有这个参数,则这个对象会被隐藏,使用的属性为query
e.参数传递,在上面的例子中,如果这个时候你点击新增,需要基于这个参数做为下一个页面的输入值,则需要把这个页面的某一个或者多个参数传递给下一个页面,这个时候需要使用的属性为linkquery
f.默认值,只需要在查询模型中赋值,即可作为默认值,如果是单选或者多选框的,需要添加一个属性selected=true,也就是修改可选对象的属性!
g.一般输入,除了支持上方的输入,当前也是支持一些基础的输入的,比如number,text等,甚至是required等,这个按照正常的写法即可!
至于搜索区域的内容是怎么来得?
在页面首次打开的时候,会从对应的API中读取这个表的2个信息,一个是下方表格的模型的属性,一个就是对应的搜索区域的模型的值!
比如:
/// <summary>
/// 读取ListDto的数据模型
/// </summary>
/// <returns></returns>
[HttpGet]
[TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "root", "root" })]
public PasteBuilderHelper.VoloModelInfo ReadListModel()
{
var _model = PasteBuilderHelper.ReadModelProperty<RoleInfoListDto>(new RoleInfoListDto());
var _query_model = PasteBuilderHelper.ReadModelProperty(new InputQueryRoleInfo());
if (_query_model != null)
{
_model.QueryProperties = _query_model.Properties;
}
return _model;
}
上面的代码中其实就是读取了模型RoleInfoListDto的属性和搜索区域的InputQueryRoleInfo的属性!
下一章将介绍数据表格中的内容