Netsharp总体设计
阅读本文请先阅读如下两篇文章
Netsharp总体设计
1.1 Netsharp终端形式
Netsharp基于.NET平台,支持的产品形态有三种:
- 北极熊(Polarbear,桌面模式,WPF实现)
- 熊猫(Panda,BS模式,纯HTML)
- 先锋(Pioneer,移动Web模式,基于Panda)
Netsharp是三种终端的全集,本文介绍的内容多以北极熊作为例子,因为北极熊功能最多、最强、最稳定。
三种形态都是前端,她们公用同一套后端,后端指的是业务服务器之后包括的功能。
1.2 Netsharp部署类型
Netsharp有五种部署类型,分别对应五种部署的场景:
类型 |
名称 |
说明 |
Desktop |
桌面客户端 |
仅仅包括界面层、实体、接口以及前后端公用的程序集 通过互联网与服务器端交互 |
Server |
业务服务器端 |
作为业务服务器,对外通过互联网公布服务接口 处理复杂的业务逻辑功能 可以做集群(暂不支持) |
Desktop_Server |
传统的CS结构 |
桌面客户端和业务服务器在同一个进程内,主要方便开发调试;单人操作的系统,或者并发要求不高的,可以使用此种模式。 |
WebFront |
WEB前端 |
Web前端服务器也是服务器,但是只负责处理界面的渲染等逻辑,不处理业务逻辑,业务逻辑通过调用业务服务器的接口来完成 Web前端服务器与业务服务器多在同一个局域网 Web前端服务器与业务服务器分开一般出于安全和性能的考虑 Web前端服务器与业务服务器分开更易于Web前端服务器做集群 WebFront模式需要管理多个Session,Desktop模式只需要管理一个Session |
WebFront_Server |
WEB前端+业务服务器 |
Web前端服务器与业务服务器在同一进程内 |
Netsharp的部署类型,可以通过bin/Netsharp.Light.exe进行设置,下图是部署类型的设置方式:
1.3 Netsharp平台管理
本章节介绍Netsharp的六个核心概念,他是Netsharp基础,这六个概念都有对应的工具支持,从工具角度上对平台的资源进行有效、清晰的管理。
这六个概念并不是Netsharp的全部内容,本节也不是介绍Netshrap的技术架构,而是介绍Netsharp平台是如何管理开发人员的成果的。
1.3.1 插件
插件框架是越来越流行的一种开发方式。插件做的比较好的常见于IDE,如Eclipse(基于OSGI标准)、Netbean、SharpDevelop。国内一款软件(OSGI.NET)实现了.NET平台的OSGI标准,算是做得比较规范的。除此之外笔者没有见过国内其他的比较正规的插件体系,大部分声称系统支持的所谓插件都是伪插件,从技术角度来说不过是工厂模式加根据配置反射创建对象而已。笔者认为插件系统有三个必须要素:
- 插件,一个插件有多个路径;插件从物理上可脱离产品独立存在
- 扩展点(Netsharp叫路径),扩展点可以横穿多个插件
- 插件项支持多种类型,如菜单、类型、图标等。插件项类型本身也有扩展点。
Netsharp的插件设计参考了SharpDevelop,SharpDevelop是一个IDE工具,有些地方并不适应于企业软件,Netsharp在SharpDevelop的基础上进行了如下的改造和扩展:
- 支持数据库配置,而非xml配置
- 路径支持继承和重写
- 插件项支持权限控制
- 提供可视化界面编辑插件项
Netsharp提供了可视化工具对插件管理,管理工具支持两种视角,插件视角和路径视角:
1.3.2 实体模型
在企业软件开发中,实体模型主要指的是实体的模型,模型一般通过UML图的方式表现,比较直观的表达问题域的静态结构关系,这种图是分析设计所关心的。而对于平台来说,关心的是做一个UML静态类图工具出来,更关心的是实体模型本身自描述的元数据信息,本文称之为实体元数据。
平台有了实体元数据,业务开发的序幕就此拉开,这个过程可以时髦的称之为“领域驱动”,不过跟常说的“领域驱动”稍有不同。基于实体元数据配合平台工具可以做的事情有:
- 生成数据库对象,包括表结构、索引、主键、约束、外键等
- 实体类代码
- 持久层的ORM映射元数据
- 自动生成接口、服务、业务类、界面控制器的类
- 自动生成报表、表单、列表、查询的界面元数据
- 可以做字段权限控制、数据权限控制
- 可以做单据编码规则
- 其他
关于Netsharp的实体设计,请参见管理软件实体设计。
1.3.3 Netsharp资源
1.3.3.1 什么是资源
资源是Netsharp创造的概念,资源包括两个方面,资源树和资源类型,其中资源树也可称之为资源节点。
如何理解资源我们从考察如下两个场景开始:
要素 |
商贸企业 |
软件开发公司 |
角色 |
公司员工 |
软件开发人员 |
工具 |
供应链管理系统(SCM) |
Netsharp |
数据类型 |
销售订单、发货单、发票、出库单等等 |
列表、表单、查询、报表 |
数据举例 |
3月1号销售给客户A总金额100W 3月1号给客户A发货 3月2号销售给客户B总金额120W |
3月1号开发销售订单列表,编辑列表元数据 3月1号开发销售订单表单,编辑表单元数据 3月2号开发销售发票列表,编辑列表元数据 |
结论 |
SCM是工具,用来管理订单、发货单等数据 |
Netsharp是工具,用来管理列表、表单、报表的元数据。 |
上述两个场景放在一起考察,他们的不同之处在于是不同的行业,干的不同的事情。相同的地方都是使用一个工具来管理自己工作中使用的数据。开发人员的数据就是工作区、列表、表单、报表等数据,Netsharp中把开发维护的这些数据叫资源。这些数据是有不同的类型,SCM的每种类型(销售销订单、发货单、销售发票等)的数据叫单据;Netsharp中的每种类型(作区、列表、表单、报表等)叫资源类型。
1.3.3.2 资源是如何管理的
资源和插件是相互补充的,插件和资源都是平台的工具,区别在于,插件强调插件物理可插拔、路径可扩展、插件项支持多种类型,但是其插件项的类型只能是携带信息比较少的类型,比如菜单。对于一些复杂的类型,比如工作区或者列表元数据,则需要强类型的结构来表达,这种情况插件表达则不太合适,资源就是解决这种问题的,而且资源还有自己的视角。Netsharp的平台工具中,大部分菜单都是使用资源进行管理的,可以说资源的概念比插件的概念要大。
Netsharp中有30种以上的资源类型,这些资源类型按照树状结构进行分类,资源的分类叫资源树,树上的每个节点叫资源节点。Netsharp中所有的资源类型的分类是统一的,即所有的资源分类都使用一个资源树。资源节点在Netsharp中对应的实体是Netsharp.Core.ResourceNode。下图是Netsharp的平台管理工具的面板,他可以通过工作区的主菜单”视图/平台工具”打开,这些工具中大部分是以资源的方式来进行管理的。
以Netsharp部件工作区(PartWorkspace)为例,部件工作区是一种资源,他按照资源树的方式进行管理,请参见下图部件工作区的工具。
下图是Netsharp的枚举管理工具,枚举是Netsharp的一种资源,他也按照资源树的方式进行管理,请参见下图:
1.3.3.3 资源是如何分类的
下图是Netsharp资源节点的管理界面,所有的资源节点组成了一棵资源树。
对于管理软件来说,一般会进行如下分类
级次 |
一级 |
二级 |
三级 |
四级 |
五级 |
本文命名 |
产品线 |
子系统 |
模块 |
领域对象 |
实体 |
ERP产品线 |
建筑施工企业软件产品 |
子系统一 |
- |
- |
- |
子系统二 |
- |
- |
- |
||
子系统三 |
- |
- |
- |
||
... |
- |
- |
- |
||
ERP产品 |
供应链 |
采购 |
采购订单 |
采购订单头 |
|
采购订单行 |
|||||
结算明细 |
|||||
进货单 |
- |
||||
采购发票 |
- |
||||
... |
- |
||||
销售 |
- |
- |
|||
库存 |
- |
- |
|||
财务 |
现金 |
- |
- |
||
往来 |
- |
- |
|||
出纳 |
- |
- |
|||
生产 |
- |
- |
- |
||
分销零售 |
- |
- |
- |
||
.... |
- |
- |
- |
上图为稍微复杂一些的系统分级结构,简单的系统可能只有第三、四、五级。第五级别的实体为研发人员视图。客户和销售人员不会有此概念,或者概念比较模糊,即他们不会把实体作为独立的概念环境进行思维。在命名上会有歧义的是第三级和第四级,即模块和领域对象。“领域对象”是本文的一种叫法,目前还没有找到更好的进行第三级和第四级进行区分的命名。使用“领域对象”的初衷是领域指的是软件给客户(某一种岗位在某一个业务场景)提供完整业务的一种最小的场景,如录入一张新的采购订单,在这个场景中,用户打开采购订单界面,可以做很多与采购订单编辑相关的事情。(这个名称感觉也不是很好,因为用户很难理解)模块可以简单的理解为是一个部门级别的应用,或者为一个需要多个岗位来完成的场景,比如采购管理。
在Netsharp的资源节点对应的实体是Netsharp.Core.ResourceNode,ResourceNode有个属性ResourceType,ResourceType是一个枚举,有三个可选值:分类、插件、单据。ResourceType是资源节点的必输字段。下面详细介绍这三种资源节点类型。
1.插件
和第三级模块对应,当资源节点类型为插件是,必须在资源节点上设置对应的插件。因为平台的资源是通过资源树管理的,当插件进行导出操作时候,平台会根据插件对应的资源节点把下属的所有资源进行导出,插件的安装、卸载也是这种逻辑。
2.单据
和第四级(领域对象)对应,当资源节点是一个领域对象时,如销售订单、采购入库单等,资源节点类型选择单据。当资源节点为单据时,必须设置资源节点的EntityId。EntityId是Netsharp中常用的概念,他表示一个领域对象,技术上对应领域对象(或者叫实体)的Type.FullName,也可以理解为实体模型的类全名,参见下图:
领域对象是实体的特例,当一个资源节点和一个实体对应时,类型都可以选择单据。
3.分类
当资源节点类型不为插件和单据时,都可以选择分类。
1.3.4 工作台
Netsharp工作台就是最终用户看到的产品的主界面,工作台有时也称之为门户。用户可以自定义工作台的布局,下图显示了默认工作台的布局结构:
下面是这六个部分的概要描述
顺序 |
名称 |
说明 |
插件路径 |
扩展说明 |
1 |
LOGO |
产品图标 |
无 |
自动读取应用程序配置的产品名称 |
2 |
用户信息区 |
|
Workbench/StatusBar/RightMenu |
|
3 |
MainMenu |
主菜单 |
Workbench/MainMenu |
Netsharp的原则是主菜单只现实系统级别的菜单(如系统选项、常用工具、视图、帮助等),不显示业务相关的菜单 |
4 |
Pad |
面板 |
Workbench/Pad |
目前平台提供了四个面板,导航栏、平台工具、业务模型、作业管理;在这个路径下可以创建自定义的导航面板, |
5 |
Workspace |
工作区 |
无 |
工作区一般会通过面板和主菜单的出发打开,不在赘述。Netsharp支持扩展自定义的工作区。 |
6 |
StatusBar |
状态栏 |
无 |
|
除了上面六个部分,还有不明显体现在界面元素上的工作台初始化相关工作项,他们分别:
顺序 |
名称 |
说明 |
插件路径 |
扩展说明 |
1 |
Autorun |
工作台初始化 |
Workbench/AutoRun/Client |
工作台启动后,会读取此路径,自动执行此路径配置的逻辑 |
2 |
Icon |
图标 |
Netsharp/Icons |
自定义的图标在这里初始化 |
3 |
Homepage |
起始页 |
Workbench/Homepage/ZonePart |
Netsharp目前的起始页是有多个Zone组成的,这里可以设置起始页的Zone |
4 |
VersionCache |
版本缓存 |
无 |
为了提高性能,把Netsharp的元数据缓存在本地,当元数据改变时自动更新缓存的机制 |
5 |
|
|
|
|
6 |
|
|
|
|
1.3.5 部件工作区
上文已经介绍了工作区(Workspace)的的概念,本节介绍一种特殊的工作区叫部件工作区(PartWorkspace),无论您是Netsharp的最终用户,还是开发人员,您时刻都会跟PartWorkspace有关。
本人认为软件的界面是一种树状的逻辑结构,在设计模式中对应着组合模式(Composite),以Netsharp的工作台为例,工作台是顶级节点,工作台由工作台页头、Pad容器、工作区容器、主菜单、状态栏等子组件组成,这几个子级别又分别有自己的子级组件,如此类推就形成了一棵树。树的末级节点一般是Textbox、ComboBox等控件。所以一般基于元数据的界面描述都使用XML格式的语法,因为XML是树状结构的,比如HTML和XAMAL。
一般来说,开发人员封装的界面组件,分成两个种,一种是技术性质的控件,比如Outlookbar,日历等;另一种是业务性质的控件,比如订单表单,和单据控件,不同的研发团队积累不一样,封装的角度也不同,如果封装单据作为控件的话,是平台化的思路,抽象层次要高一些。Netsharp是平台所以会对单据进行封装,但是Netsharp封装的力度比单据要细一个级别,本文称之为部件。一个工作区是由多个部件组成的,部件之间一般有父子关系。对于订单的表单来说,其工作区一般由两个部件组成:实体的表单部件(父)和实体明细列表部件(子)。对于订单列表来说,界面可以有三个部件:订单列表(父)、订单表单(子)、订单子表(子或者孙,父亲为列表或者表单),子表部件和表单部件可以被重用,做出更多灵活的界面。部件对于做界面设计和二次开发都提供了比较好的角度,可以说是技术和业务上最理想的封装粒度。
Netsharp提供了20种部件,用户可以继承扩展这些部件,也可以实现自己独立的部件,Netsharp部件参考下图:
序号 |
编码 |
名称 |
默认控制器 |
默认工具栏 |
说明 |
1 |
EntityList |
列表.主列表 |
Netsharp.Commerce.EntityListPart |
Netsharp/Commerce/EntityList/Toolbar |
|
2 |
Datagrid |
列表.只读 |
Netsharp.Commerce.DatagridPart |
Netsharp/Commerce/Datagrid/Toolbar |
|
3 |
EntityDetail |
列表.单据列表 |
Netsharp.Commerce.EntityDetailPart |
Netsharp/Commerce/EntityDetail/Toolbar |
|
4 |
VoucherDetail |
列表.单据明细列表 |
Netsharp.Commerce.VoucherDetailPart |
Netsharp/Commerce/Voucher/DetailMenu |
|
5 |
Detail |
列表.细列表 |
Netsharp.Commerce.DetailPart |
Netsharp/Commerce/Voucher/DetailMenu |
|
6 |
DatagridSolution |
列表方案 |
Netsharp.Commerce.DatagridSoltionPart |
Netsharp/Commerce/QuerySolution/MainMenu |
|
7 |
ReportList |
列表.报表 |
Netsharp.Commerce.DatagridReportPart |
Netsharp/Commerce/Voucher/DatagridReportMenu |
|
8 |
VoucherForm |
表单.单据 |
Netsharp.Commerce.VoucherFormPart |
Netsharp/Commerce/Form/Navigation/Toolbar |
|
9 |
CustomerForm |
表单.可保存 |
Netsharp.Commerce.FormPart |
Netsharp/Commerce/Form/Edit/Toolbar |
|
10 |
FormPart |
表单.属性 |
Netsharp.Commerce.FormPart |
Netsharp/Commerce/Form/Property/Toolbar |
|
11 |
ReferencePart |
表单.引用表单 |
Netsharp.Commerce.ReferencePart |
Netsharp/Commerce/Voucher/ReferenceMenu |
|
12 |
ReportStatistics |
报表.统计表 |
Netsharp.Grus.SummaryReportPart |
Netsharp/Commerce/Datagrid/Toolbar |
|
13 |
ReportRdlc |
报表.交叉表 |
Netsharp.Grus.RdlcReportPart |
Netsharp/Grus/RdlcReport/Toolbar |
|
14 |
ReportGrus |
报表.GRUS |
Netsharp.Grus.GrusPart |
|
|
15 |
ReportQueryFilter |
报表查询条件 |
Netsharp.Commerce.RdlcQueryFilterPart |
Netsharp/Commerce/QueryFilter/MainMenu |
|
16 |
ReportSolution |
报表方案 |
Netsharp.Grus.ReportSolutionPart |
Netsharp/Grus/ReportSolution/Toolbar |
|
17 |
TreePart |
分类树 |
Netsharp.Commerce.TreePart |
Netsharp/Commerce/CategoryTreePart/Toolbar |
|
18 |
QuerySolution |
查询方案 |
Netsharp.Commerce.QuerySolutionPart |
Netsharp/Commerce/Solution/MainMenu |
|
19 |
QueryFilter |
查询条件 |
Netsharp.Commerce.QueryFilterPart |
Netsharp/Commerce/QueryFilter/MainMenu |
|
20 |
Customer |
自定义 |
|
|
|
1.3.6 六驾马车
Netsharp有六驾马车的概念,这六驾马车都基于插件使用,可以拥有非常强大的功能。六驾马车是从技术角度对开发六种场景抽象,他们分别是:
编号 |
英文名 |
中文名 |
说明 |
场景 |
开发相关 |
1 |
Command |
命令 |
界面操作的一个触发,常用的有Button、MenuItem、Toolbar的事件 |
系统点击“退出”按钮,执行Netsharp.Platform.ApplicationExitCommand |
界面层使用,一般和菜单、树节点、工具栏项上配置 |
2 |
Trigger |
字段触发器 |
某一个字段被修改之后,引起其他字段的计算 |
修改单价和数量时,自动计算金额 |
重写实体的OnPropertyChanged方法 实现IPropertyTrigger接口 界面层Controller中的On**Changed方法 |
3 |
Validation |
字段验证 |
数据合法性验证 |
保存时的邮件验证 |
实体属性Set调用时捕获的异常信息实现接口IPropertyValidation |
4 |
Condition |
字段条件 |
某个字段在某种场景下不可以编辑或者隐藏 |
审核后数量不能修改 |
重写实体的Condition方法 实现接口IPropertyCondition 界面层Controller的**Condition方法 |
5 |
OperationCondition |
操作条件 |
操作按钮在某个场景下不可用或者隐藏 |
审核后不能删除 |
实现接口IOperationCondition 在插件中配置 |
6 |
Action |
(无) |
一个实体的操作分成多个步骤执行,每个步骤叫一个Action。 界面客户端和服务端都可以使用Action |
客户端和服务端都可以使用,参见下文 |
实现接口IAction 在插件中配置 服务端的路径为服务类型全名+方法名 客户端的路径为控制器类型全名+方法名 |
本文是体系结构的介绍,关于每驾马车在第三个系列Netsharp开发中都会有详细的介绍,这里只说明一下Action在界面端和服务端的两个种:
一、客户端Action场景:
例如,在Netsharp平台的普通的一张表单界面上,用户执行保存按钮时,执行的是Controller的Save方法,按照顺序执行的逻辑如下:
顺序 |
功能 |
Action |
说明 |
1 |
调用前置方法OnSaving |
OwnerMethodAction |
|
2 |
调用前置事件Saving |
OwnerEventAction |
|
3 |
性能跟踪开始 |
StopwatchStartAction |
|
4 |
显示Loadingbar |
LoadingbarStartAction |
|
5 |
界面端录入合法性校验 |
FormpartSaveAssertAction |
|
6 |
调用保存服务 |
FormpartSaveAction |
|
7 |
调用保存后置事件Saved |
OwnerEventAction |
|
8 |
调用保存后置方法OnSaved |
OwnerMethodAction |
|
9 |
隐藏Loadingbar |
LoadingbarEndAction |
|
10 |
性能跟踪停止 |
StopwatchEndAction |
二、服务端Action场景
例如,在订单保存时服务方法中执行的逻辑,按照顺序如下:
顺序 |
功能 |
Action |
说明 |
1 |
信用控制 |
||
2 |
可用量控制 |
||
3 |
最低售价控制 |
||
4 |
订单基本校验 |
||
5 |
订单持久化到数据库 |
||
6 |
生成收款单 |
||
7 |
生成出库单 |
||
8 |
生成加工单 |
||
9 |
记往来账 |
||
10 |
记可用量帐 |
||
11 |
更新客户信用 |
||
12 |
更新最低售价 |
1.4 Netsharp组件清单
分类 |
组件 |
功能特征 |
客户可见 |
工具支持 |
4.0版本已支持 |
元数据管理方式 |
1 |
实体模型 |
可持久化 可序列化 实体支持三驾马车 平台自定义数据类型 平台提供常见的若干父类(可持久化实体、业务实体、分类实体) 支持字段扩展 可视化实体设计 |
否 |
UML建模工具 |
是 |
插件 |
2 |
插件机制 |
参考SharpDevelop插件机制(改造成适合管理软件的插件模式) 数据库格式 路径支持继承 插件项支持重写 支持插件项与功能权限绑定 |
否 |
插件编辑工具 插件浏览工具 安装卸载工具 |
是 |
插件 |
3 |
持久层 |
多数据库 级联对象增删改查 OQL查询 并发控制 引用检查 基于Ado.net的事务 分布式事务(暂不支持) 支持Sqlserver 部分支持Mysql 可扩展支持Oracle 可扩展支持其他数据库 |
否 |
OQL查询分析器 |
是 |
无 |
4 |
分布式 |
服务调用级别事务 多种访问方式(HTTP\TCP) 高性能的序列化 客户端动态代理 日志跟踪 根据父类的实体默认提供服务实现如:EntityService、BusinessEntityService、VoucherService |
否 |
性能跟踪查看其 |
是 |
无 |
5 |
工作台 |
支持自定义布局 默认布局支持Pad、Workspace、主菜单、状态来自定义配置 支持产品名、公司版权、LOGO、版本等自定义设置 登录界面支持自定义背景图片 |
是 |
是 |
插件和配置文件 |
|
6 |
单点登录 |
暂不支持 |
是 |
否 |
无 |
|
7 |
多国语言 |
基于数据库配置 平台提供多语言工具 |
是 |
多语言维护工具 |
是 |
资源树 |
8 |
并发 |
基于Ts的并发控制 根据系统选项确定是否并发控制 |
否 |
实体元数据上设置 |
是 |
实体模型 |
9 |
互斥 |
两个业务场景不能同时发生 |
否 |
否 |
资源树 |
|
10 |
表单 |
根据实体元数据快速生成表单 支持最终用户的字段设置 支持常见的控件类型 数据的双向绑定 字段显示,必输,可空,公式等设置 默认打印 |
是 |
表单管理工具 |
是 |
资源树 |
11 |
列表 |
根据实体元数据快速生成列表 支持最终用户的字段设置 支持常见的控件类型 数据的双向绑定 支持分页 支持懒加载 可设置字段:显示,必输,可空,排序,汇总等属性 支持默认打印 |
是 |
列表管理工具 |
是 |
资源树 |
12 |
查询 |
根据实体元数据快速生成查询 支持最终用户的字段设置 支持常见的控件类型 多种查询控件 自定义查询方案 |
是 |
查询工具 |
是 |
资源树 |
13 |
打印 |
可视化打印模板设置 支持汇总表 支持交叉表 支持自定义报表 图表(暂时不支持) |
是 |
报表设计器 报表工具 |
是 |
资源树 |
14 |
权限控制 |
功能权限/字段权限 数据权限 权限约束/权限互斥 分级授权 |
是 |
操作管理工具 |
是 |
资源树 |
15 |
编码规则 |
支持流水号 支持编号包含普通文本 3. 支持编号包含当前实体字段 |
是 |
编码规则设置工具 |
是 |
资源树 |
16 |
AOP |
暂不支持 |
否 |
否 |
无 |
|
17 |
性能统计分析 |
自动 |
否 |
性能统计选项开关 性能分析器 |
是 |
无 |
18 |
自动化测试 |
暂不支持 |
否 |
否 |
无 |
|
19 |
脚本引擎 |
支持C#脚本功能 |
否 |
脚本测试工具 |
是 |
无 |
20 |
UI控件套件 |
使用Telerik控件库 自定义若干控件 |
是 |
是 |
无 |
|
21 |
业务选项 |
基于插件的选项配置 默认提供多种数据类型的选项控件 |
是 |
插件工具 |
是 |
插件 |
22 |
向导 |
支持向导框架 |
是 |
是 |
无 |
|
23 |
组织机构 |
支持用户/角色 支持多组织 支持总公司/子公司/部门/分类/项目/职务/岗位 |
是 |
是 |
无 |
|
24 |
界面三驾马车 |
状态控制 触发器 编辑验证 |
是 |
是 |
硬编码 插件 界面元数据 |
|
25 |
工作流 |
是 |
否 |
资源树 |
||
26 |
创建帐套 |
暂不支持 |
是 |
否 |
无 |
|
27 |
异常管理 |
异常框架 异常跟踪 异常查看 |
否 |
异常列表查看 |
是 |
资源树 |
28 |
枚举 |
表单、列表、查询对应的控件 自动生成枚举代码 |
是 |
枚举管理工具 |
是 |
资源树 |
29 |
参照 |
支持下拉列表 支持弹出参照 支持表单、列表、查询动态创建默认参照 支持添加自定义的过滤条件 支持添加当前行的变量作为条件 支持C#脚本生成条件 |
是 |
参照管理工具 |
是 |
资源树 |
30 |
预警/提醒/通知 |
是 |
插件工具配置 |
是 |
资源树 |
|
31 |
作业 |
基于Quartz.NET 支持可视化的触发器设置 可视化创建作业 支持作业日志跟踪 |
否 |
作业管理工具 |
是 |
资源树 |
32 |
日志组件 |
否 |
生成日志文件 |
是 |
无 |
|
33 |
客户端自动升级 |
客户端发现新版本时自动升级 |
无 |
|||
34 |
数据库脚本升级工具 |
低版本到高版本升级时,自动执行若干脚本 |
||||
35 |
缓存 |
内存缓存 缓存服务器 单个对象缓存 SET缓存 |
||||
36 |
Session管理 |
超时验证 踢出管理 |
无 |
|||
37 |
业务日志 |
单据增删改查自动记录日志 登录等操作自动记录日志 日志查看、跟踪 |
无 |
|||
38 |
导出SQL脚本 |
列表、表单支持导出当前数据位SQL脚本 支持导出当前数据及组合数据 支持根据ById导出 支持导出全表 支持任意SELECT语句的脚本导出 |
单据、列表的二次开发菜单 SQL查询分析器 |
1.5 Netsharp发展路线图
Netsharp路标规划分成五个阶段,参见下图,目前基本完成第二个阶段,即平台产品化阶段。
本文特别感谢东莞许胜平的建议和校对工作。
Netsharp总体设计的更多相关文章
- Netsharp系列文章目录结构
作者:秋时 转载须说明出处 Netsharp交流群:338963050(请有详细的请求说明) ->. 总体介绍 Netsharp总体介绍 一. Netsharp快速入门系列 Netsharp ...
- 【开源】OSharp框架解说系列(1):总体设计及系列导航
系列文章导航 [开源]OSharp框架解说系列(1):总体设计 [开源]OSharp框架解说系列(2.1):EasyUI的后台界面搭建及极致重构 [开源]OSharp框架解说系列(2.2):EasyU ...
- ASP.NET Core中的依赖注入(5): ServiceProvider实现揭秘 【总体设计 】
本系列前面的文章我们主要以编程的角度对ASP.NET Core的依赖注入系统进行了详细的介绍,如果读者朋友们对这些内容具有深刻的理解,我相信你们已经可以正确是使用这些与依赖注入相关的API了.如果你还 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-2.框架的总体设计
目 录 C#通讯(串口和网络)框架的设计与实现... 1 (SuperIO)- 框架的总体设计... 1 第二章 框架总体的设计... 2 2.1 ...
- 基于C/S架构的3D对战网络游戏C++框架_02系统设计(总体设计、概要设计)
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- Netsharp介绍
1.1 Netsharp是什么 Netsharp定义: Netsharp业务基础平台 = 1.系统框架 + 2.元数据 + 3.平台工具 + 4.基础业务 + 5.二次开发 此五个概念请参考什 ...
- 安装Netsharp演示插件
阅读本文请先阅读Netsharp下载及环境搭建 Netsharp提供了DEMO程序,DEMO完成的功能是Netsharp文章系列中的Netsharp快速入门系列中介绍的功能,DEMO是以Netshar ...
- Netsharp产品标识自定义设置:产品名称、版权、LOGO等
阅读本文请先阅读Netsharp下载及环境搭建 Netsharp本身是一个业务基础平台,Netsharp本身基础上开发的业务产品对客户才有价值,客户看到的产品应该不是Netsharp而是具体的业务产品 ...
- Netsharp FAQ
1.启动服务器时候不能监听端口,出现如下错误: 回答: 这种问题应该是在win7环境下才有,是没有权限,要以管理员身份运行Netsharp.Elephant.Q.exe. 2.启动服务器的时候,服务端 ...
随机推荐
- html动态元素点击事件添加
很多时候,页面的元素是后期异步动态添加在页面上.页面点击事件无效. 非动态的元素直接$().click();便可以直接触发点击事件,而动态元素需要事先注册事件. $(document).on('cli ...
- 解决mysqli的中文乱码问题
有时候我们向服务器传汉字,出现内容为空,或???的问题,是因为mysqli对utf8的解码属于 Unicode码,会解析为 Unicode 码:所以我们要对内设置成gbk码, 尽管gbk码,很古来,但 ...
- startup.bat 一闪而过解决方案
原文地址:http://blog.csdn.net/stypace/article/details/38083581 启动tomcat时cmd窗口一闪而过解决方法. 注: 我这边只是配置了环境变量就o ...
- Keras处理已保存模型中的自定义层(或其他自定义对象)
如果要加载的模型包含自定义层或其他自定义类或函数,则可以通过 custom_objects 参数将它们传递给加载机制: from keras.models import load_model # 假设 ...
- Promise事件比timeout优先
Promise, setTimeout 和 Event Loop 下面的代码段,为什么输出结果是1,2,3,5,4而非1,2,3,4,5?(function test() { setTimeout(f ...
- Python全栈开发记录_第一篇(循环练习及杂碎的知识点)
Python全栈开发记录只为记录全栈开发学习过程中一些难和重要的知识点,还有问题及课后题目,以供自己和他人共同查看.(该篇代码行数大约:300行) 知识点1:优先级:not>and 短路原则:a ...
- [Oracle,2018-03-01] oracle常用函数
最近经常用到一些oracle中的函数,今天就总结一些常用的: 一.单行函数 只处理单个行,并且为每行返回一个结果. 1.字符函数 (1)concat(str1,str2)字符串拼接函数 select ...
- Android开发 assets目录
Android资源文件分类: Android资源文件大致可以分为两种: 第一种是res目录下存放的可编译的资源文件: 这种资源文件系统会在R.Java里面自动生成该资源文件的ID,所以访问这种资源文件 ...
- android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)
package net.yt.yuncare.widgets; import android.graphics.Bitmap; import android.graphics.Canvas; impo ...
- Oracle创建pfile spfile 文件及其恢复
1.Oralce在启动实例的时读取$ORACLE_HOME/dbs下面的初始化文件.初始化文件分为:A.静态参数文件PFILE,一般名为initSID.oraB.永久参数文件SPFILE,一般名为sp ...