在之前的文章中,我详细阐述了我对CRUD(创建、读取、更新、删除)操作的理解,并付诸实践,开发了一个案例项目——PasteTemplate。随后,这个项目在实际应用中得到了进一步的验证和改进,特别是在PasteBuilder(贴Builder)和PasteSoft(贴代码)这两个实际项目中。
——— 点我访问PasteForm框架文档 ———
在实际项目中,我对案例项目进行了新的调整,主要是为了满足实际需求,因为一个不能应用于实际项目的框架是没有意义的!
案例项目基于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则可以实现更多功能:
PasteBuilder是专为PasteTemplate模板项目创建的右键代码生成器,作为VS2022的插件。安装后,只需在XXX.Domain中对应的模块添加表的Model,然后右键生成代码,即可在EF、Application等模块中自动生成代码。之后,右键重新生成解决方案,理论上可以直接生成成功,然后执行add-Migration生成对应的迁移代码。
本次项目改动较大。之前发布的PasteTemplate作为项目模板,其核心思想是将一些基础功能封装成模板,后续开发新项目时,直接选择该模板即可生成新项目,避免了重复搭建基础框架的麻烦。项目命名、文件命名等都是全新的,避免了从旧项目中复制代码并重命名的繁琐过程。
新的登录页面将采用统一的设计,后续项目的前端(管理端)几乎无需修改代码,只需调整后端代码即可。登录页面作为重要的一部分,主要改动在于样式和引用动效。接口地址主要在/api/app/User/xxx
中。
管理端首页通常包含菜单页面和工作台。PasteTemplate的管理端首页如下:
左侧菜单采用动态模式,菜单由权限控制。系统在首次启动时会将默认菜单写入数据库。如果当前账号拥有root-root
权限,则会返回所有菜单,root-root
表示超级权限,拥有系统的所有权限。
作为本次的主角,PasteForm实现了CRUD操作,由三个页面组成:
表单页面的主页面,显示数据列表。如下图所示:
主要包含以下几个区域:
InputQueryXXXModel
控制,动态生成。包含以下功能:outer
。select
。selects
。query
。linkquery
。selected=true
。number
、text
等。搜索区域的内容来源如下:
在页面首次打开时,会从对应的API中读取表的两个信息:表格模型的属性和搜索区域的模型值。例如:
/// <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
属性。
下一章将详细介绍数据表格中的内容。