PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管理端只有Html+js版本的,后续将支持小程序,Vue等
案例源码在
https://gitee.com/pastecode/paste-template
不定期升级
通过引入PasteForm,一个项目哪怕100个数据表,一般的管理页面也才不到10个,除非有非常多的特殊功能,否则都能用PasteForm中的表格和表单来实现!
本次的特性介绍,涉及的东西会多一些,你可以下载源码后,看看详细的,我们先来查看下各个特性的信息
对于管理端来说,操作文档说是必须的,又不一定是,即使你有操作文档,用户也不太会去翻翻文档,因为你当前看到的东西,你还得去文档找到对应的地方,这本身就有一定的操作性,懒!所以一般是没有用户去查看的,所以我们就需要引入一个类似书签一样的东西,比如你在填写字段年龄的时候,不知道这个是干嘛的,就需要可以有一个快捷操作,点击直接能查看!这就是mark特性的由来!
字段详细说明,或者是文档,这里是做一个描点,需要使用公共函数自己实现具体的要求,一般的是项目下面的模块的某一个字段的说明,一个项目往往这个是一样的,然后就是哪个模块的哪个字段,所以有2个字段
会在title后面生成一个span class=”tapmark” onclick=”global_tap_mark(_modek,_code)”;
字段 | 类型 | 示例 | 说明 |
---|---|---|---|
args1 | 字符 | product | 一般作为模块使用,比如商品的这个模块,如果不填直接使用本页面的calssPath |
args2 | 字符 | code | 模块下的一个字段的说明,比如code这个字段的用法,案例说明等,如果不填写则使用当前字段名称 |
如上所言,点击对应的?图标后,需要系统自我实现函数global_tap_mark,否则会提示找不到这个函数!
在PasteSpider的后台中,有如下的信息
也就是在需要注释的地方做一个mark特性标记即可,如果是PasteSpider的,点击后会打开一个网页,网页会转到对应的文档说明处(页面的打开后转到描点)
比如我点击上面的“代码”后面的?,则会打开网页
https://soft.pastecode.cn/BookMark/spider/service/code#spider-service-code
直接就转到对应的信息中了!
/// <summary>
///
/// </summary>
public class ServiceInfoAddDto
{
///<summary>
///项目
///</summary>
[Required]
[ColumnDataType("outer", "projectInfo", "", "id", "name")]
[ColumnDataType("query","projectid")]
public int ProjectId { get; set; }
///<summary>
///代码 用于镜像前缀,示例api,注意需要是小写
///</summary>
[ColumnDataType("mark","service","code")]
[RegularExpression("^[a-z][a-z,0-9]{2,7}$", ErrorMessage = "代码必须小写开头,允许输入小写字母和数字,不能为空!")]
[MaxLength(16)]
[Required]
public string Code { get; set; }
// 其他字段这里做隐藏
///<summary>
///监听端口 这里指的是你的服务的端口,一般为80,这个要看开发启动服务的时候监听哪个,支持多个,用英文逗号隔开示例80,443
///</summary>
[MaxLength(128)]
[ColumnDataType("mark", "service", "listenport")]
public string ListenPorts { get; set; } = "80";
///<summary>
///启动参数 示例-p_8000:80
///</summary>
[ColumnDataType("textarea")]
[ColumnDataType("mark", "service", "actioncommand")]
public string OtherArgs { get; set; }
///<summary>
///执行参数 示例node_server.js
///</summary>
[ColumnDataType("textarea")]
[ColumnDataType("mark", "service", "runcommand")]
public string EnvironmentArgs { get; set; }
/// <summary>
/// 参数一 用于启动变量用
/// </summary>
[MaxLength(128)]
[ColumnDataType("text")]
[ColumnDataType("mark", "service", "argsx")]
public string Args1 { get; set; } = "";
/// <summary>
/// 参数二 用于启动变量用
/// </summary>
[MaxLength(128)]
[ColumnDataType("text")]
[ColumnDataType("mark", "service", "argsx")]
public string Args2 { get; set; } = "";
/// <summary>
/// 参数三 用于启动变量用
/// </summary>
[MaxLength(128)]
[ColumnDataType("text")]
[ColumnDataType("mark", "service", "argsx")]
public string Args3 { get; set; } = "";
}
如上所示,约定书签分3个层级,最高是软件,比如你的商城系统和客服系统的操作文档不会写一块去吧,然后是分模块,最后是点,比如商城系统中-订单-的支付金额 这个字段的说明!
<% if(item.title){ %>
<label class="form-label"><%:=item.title%><%if(item.mark){%><span class="tapmark" onclick="global_tap_mark('<%:=item.mark.model%>','<%:=item.mark.value%>')">?</span><%}%><%if(item.required){%><span class="form-required">*</span><%}%></label>
<% }else{ %>
<label class="form-label-empty"></label>
<% } %>
case "mark":
{
var _mark={
model:_classPath,
value:item.name
};
if(_attribute.args1){
_mark.model = _attribute.args1;
}
if(_attribute.args2){
_mark.value = _attribute.args2;
}
item.mark =_mark;
}
break;
更多特性见
我们下期见!