EntityModel 系列之 后台API基础功能

1 控制器类(ApiControlerXXX类)

以下的类都是向前继承的

1.1 ApiControler

是ZeroNet的Api控制器的基类,实现了Api调用过程

  • 通讯支持及通讯透明化

透明化即使用者无须关心也无法直接更改

  • 实现ZeroNet调用流程处理
  • 定义基础的API规范

1.3 ApiControllerEx

为管理后台提供基础基础支持

1.4 ApiController<>

  1. 实体对象实现IIdentityData
  2. 业务逻辑类基于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<>

扩展支持数据状态管理,此时:

  1. 实体对象实现IStateData
  2. 业务逻辑类基于BusinessLogicByStateData类
  3. 读取列表数据时,如果参数包含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类
  1. 读取列表数据时,如果参数包含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族方法来简洁地读取参数

参数规则:
  1. 所有只需要ID的用户单选或多选操作,参数都是selects,是以逗号分开的主键数组可通过GetLongArrayArg(“selects”)方法取得。

2.2 AddNew与Update时读取Form

  1. AddNew流程
    系统接收请求→构造FormConvert→构造Data对象→ReadFormData方法填充数据→Business.AddNew→返回操作结果

这两种用户调用的保存操作,数据的__IsFromUser属性会被设置为true,以便识别行为类型

  1. Update流程为 :
    系统接收请求→构造FormConvert对象→通过ID读取数据库最新数据→ReadFormData方法填充数据→Business.Update→返回操作结果

我们采用无并发处理方式,所以在Update操作时会先通过ID读取数据库最新数据 。

  1. FormConvert类
    在保存操作(AddNew\Update)时构造,在ReadFormData重载方法中使用。FormConvert类提供ToXXX族方法方便地获取表单的值

内部也是将Form表单数据预读到Arguments属性

  1. 重载ReadFormData方法填充数据
    数据填充的方法重要但很无趣,所以默认这部分工作由设计器生成代码完成。

为了让你能抄到生成的代码,所以生成在代码在的DefaultReadFormData方法中。

  1. 如何自定义控制
    当你感觉设计器生成的代码不够用时,你可以在ReadFormData中直接手工处理。我们建议可用的代码直接复制过来,防止手贱打错字而出现BUG。

一种常见的情况是:保存时只允许更新部分数据。

  1. 扩展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 当前页面权限配置

可通过这两个属性进行权限控制

猜你喜欢

转载自blog.csdn.net/longhutian/article/details/88301189