1 控制器类(ApiControlerXXX类)
以下的类都是向前继承的
1.1 ApiControler
是ZeroNet的Api控制器的基类,实现了Api调用过程
- 通讯支持及通讯透明化
透明化即使用者无须关心也无法直接更改
- 实现ZeroNet调用流程处理
- 定义基础的API规范
1.3 ApiControllerEx
为管理后台提供基础基础支持
1.4 ApiController<>
- 实体对象实现IIdentityData
- 业务逻辑类基于UiBusinessLogicBase类
实现基础的增删改查接口
功能 | 方法 | API的URL | Get参数 | Form表单 |
---|---|---|---|---|
列表 | List | [RoutePrefix]/edit/list | 视具体而定 | 查询条件 |
读取一行数据 | Details | [RoutePrefix]/edit/list | id | - |
新增一行数据 | AddNew | [RoutePrefix]/edit/addnew | - | 读取 |
更新一行数据 | Update | [RoutePrefix]/edit/update | id | 读取 |
删除多行数据 | Delete | [RoutePrefix]/edit/delete | selects | - |
1.5 ApiControllerForDataState<>
扩展支持数据状态管理,此时:
- 实体对象实现IStateData
- 业务逻辑类基于BusinessLogicByStateData类
- 读取列表数据时,如果参数包含dataState,则作为查询条件,否则只查询未删除的数据
var state = GetIntArg("dataState", 0x100);
if (state >= 0 && state < 0x100)
{
lambda.AddRoot(p => p.DataState == (DataStateType)state);
}
else
{
lambda.AddRoot(p => p.DataState < DataStateType.Delete);
}
功能 | 方法 | API的URL | Get参数 |
---|---|---|---|
锁定数据 | Lock | [RoutePrefix]/state/lock | selects |
废弃数据 | Discard | [RoutePrefix]/state/discard | selects |
禁用数据 | Disable | [RoutePrefix]/state/reset | disable |
启用数据 | Enable | [RoutePrefix]/state/enable | selects |
重置数据状态 | Reset | [RoutePrefix]/state/reset | selects |
1.6 ApiControllerForAudit<>
扩展支持审核状态管理,此时
- 实体实现IHistoryData, IAuditData, IIdentityData接口
- 业务逻辑类基于BusinessLogicByAudit类
- 读取列表数据时,如果参数包含audit,则作为查询条件
var audit = GetIntArg("audit", -1);
if (audit == 0x100 || audit < 0)
return base.GetListData(lambda);
if (audit <= (int) AuditStateType.End)
{
lambda.AddRoot(p => p.AuditState == (AuditStateType)audit);
return base.GetListData(lambda);
}
switch (audit)
{
case 0x10: //废弃
case 0xFF: //删除
SetArg("dataState", audit);
break;
case 0x13: //停用
SetArg("dataState", (int)DataStateType.Disable);
break;
case 0x11: //未审核
lambda.AddRoot(p => p.AuditState <= AuditStateType.Again);
break;
case 0x12: //未结束
lambda.AddRoot(p => p.AuditState < AuditStateType.End);
break;
}
功能 | 方法 | API的URL | Get参数 | 说明 |
---|---|---|---|---|
校验审核数据 | Validate | [RoutePrefix]/audit/validate | selects | 提交时也会校验,且校验不通过是无法完成提交审核操作的 |
提交审核 | SubmitAudit | [RoutePrefix]/audit/submit | selects | |
拉回已提交的审核 | Pullback | [RoutePrefix]/audit/pullback | selects | 30分钟内可操作 |
退回(审核) | BackAudit | [RoutePrefix]/audit/back | selects | 已提交未审核的数据,重新进入编辑状态 |
审核不通过 | AuditDeny | [RoutePrefix]/audit/deny | selects | 数据锁定 |
审核通过 | AuditPass | [RoutePrefix]/audit/pass | selects | 数据锁定 |
重新审核 | UnAudit | [RoutePrefix]/audit/redo | selects | 之前已审核过的数据,重新进入编辑状态 |
2 参数解析
一般前后端数据析,都是用反序列化方式,但这可能导致一些黑盒效应(不能精确控制行为),所以我们采用比较原始的方式去读取Form表单或Get参数。这同时导致的后果是,编码量很大,这里通过设计器自动生成代码来解决这个问题。
2.1 Arguments属性(protected)
这个是一个懒加载属性,即第一次使用前初始化,初始化时,会将Get参数读入到Arguments属性中),后续可通过对Arguments属性的操作得到传入参数。
为了方便编码,提供了SetArg族方法来扩展参数内容,GetArgXXX族方法来简洁地读取参数
参数规则:
- 所有只需要ID的用户单选或多选操作,参数都是selects,是以逗号分开的主键数组可通过GetLongArrayArg(“selects”)方法取得。
2.2 AddNew与Update时读取Form
- AddNew流程
系统接收请求→构造FormConvert→构造Data对象→ReadFormData方法填充数据→Business.AddNew→返回操作结果
这两种用户调用的保存操作,数据的__IsFromUser属性会被设置为true,以便识别行为类型
- Update流程为 :
系统接收请求→构造FormConvert对象→通过ID读取数据库最新数据→ReadFormData方法填充数据→Business.Update→返回操作结果
我们采用无并发处理方式,所以在Update操作时会先通过ID读取数据库最新数据 。
- FormConvert类
在保存操作(AddNew\Update)时构造,在ReadFormData重载方法中使用。FormConvert类提供ToXXX族方法方便地获取表单的值
内部也是将Form表单数据预读到Arguments属性
- 重载ReadFormData方法填充数据
数据填充的方法重要但很无趣,所以默认这部分工作由设计器生成代码完成。
为了让你能抄到生成的代码,所以生成在代码在的DefaultReadFormData方法中。
- 如何自定义控制
当你感觉设计器生成的代码不够用时,你可以在ReadFormData中直接手工处理。我们建议可用的代码直接复制过来,防止手贱打错字而出现BUG。
一种常见的情况是:保存时只允许更新部分数据。
- 扩展Business方法
参见:在数据保存时进行扩展操作
3 API调用的上下文
3.1 GlobalContext.Current
通过GlobalContext.Current属性暴露
- IsManageMode = true
让你在BL等状态无法类中可判断是否来自管理后台的API调用 - LastState 与 LastMessage
由于基类已直接实现了最常用的方法,为了方便基类判断具体的错误代码及错误消息,可在任意位置设置这两个属性。只要你的操作返回为false,基类就会取这两个值去构造错误返回。 - User
网关鉴权后,会将用户信息一直传递下去,你通过这个属性就可取得当前登录用户的基本信息。
3.2 BusinessContext.Context
BusinessContext是GlobalContext的默认扩展
- PageItem 当前页面节点配置
- CurrentPagePower 当前页面权限配置
可通过这两个属性进行权限控制