软件开发框架培训实时讲解总结-CSFrameworkV5.1旗舰版
软件开发框架培训实时讲解总结-CSFrameworkV5.1旗舰版
客户:宁德时代
目录
- 扁平按钮,UI界面
- 开发环境配置 – VS开发环境对应的DevExpress版本
- 开发框架子系统
- 日志管理
- 明细表记录的排序算法
- 开发框架加解密算法
- vs改名工具 CSFramework.Rename
- 集团数据权限控制
- SqlCommandGenerator - SQL命令生成器
- ORM模型/ Model 重点部分
- 主从子表,三层表,层级表
- 提交多表时(DataSet)怎样数据采集?
- 窗体、类命名规范(按功能名称排序)
- 关于流水号码自动生成
- 每个DAL层必须重写CreateSqlGenerator方法
- CSFramework.DB.dll (数据库底层接口组件)
- frmBaseXXX基类窗体里面重要的方法
- 框架基类界面
- 文本输入框命名规则
- 文本输入框赋值方式
- CSFrameworkV5.DataAccess 数据访问层几个重要的方法
- 动态加载模块
- 账套管理与维护
- 常量改名注意事项
- 代码生成器 CodeGenerator
- 新开发的界面如何给用户分配权限
- 扩展按钮
- 隐藏按钮: InitButtons方法的最后面加代码
- WCF开发
- 关于数据处理超时解决方案
扁平按钮,UI界面
Cursor=Hand
ButtonStyle=HotFlat
ImageOptions.Image=DevExpress图标
关于模块的主图标,必须是透明背景32bit,png/ico格式
开发环境配置 – VS开发环境对应的DevExpress版本
VS2015, 安装DevExpress 15.x
VS2017, 安装DevExpress 17.x
VS2019, 安装DevExpress 19.x
DevExpress组件历史版本
https://www.devexpress.com/Support/Versions.xml
开发框架子系统
ClientFoundation开发架构配置
附加2个数据库:
CSFrameworkV5_System(系统库)
CSFrameworkV5_Normal(账套库)
配置系统库的 tb_Dataset 表,核对 DBUser,DBPassword字段的内容,密码使用DemoTester.exe工具加密。
SqlConnector.exe 连接配置系统库
操作手册:https://www.cscode.net/archive/csframework-sqlconnector/1631288677.html
CodeGenerator.exe 代码生成器-连接配置
操作手册:https://www.cscode.net/archive/csframework-sqlconnector/1631288677.html
AutoUpgrader.exe 自动升级程序,配置连接
操作手册:https://www.cscode.net/archive/autoupgrader/1630589770.html
日志管理
操作日志:系统登陆日志,系统操作日志, Log.LogDB(), Log.LogLocal()。
数据日志: 需要配置写日志的列,配置重要列,比如:名称,数值类,用于记录旧值、新值、修改人,时间等信息。
功能入口:系统管理模块【日志配置】
明细表记录的排序算法
明细表要增加一个排序字段,如:Queue,类型:decimal(18,4)
插入记录的算法:(Current-Prior)/2+Current
查询排序:Order By Queue ASC
开发框架加解密算法
开发框架使用Rijdenal对称加密算法, 传统加密DES/AES:DES加密太简单,容易破解。
RSA加密256位,签名算法,特点:需要分发公钥+私钥,算法速度慢。
加解密工具的密码:key(8位)+iv(8位)偏移量。
vs改名工具 CSFramework.Rename
https://www.csframework.com/archive/1/arc-1-20201110-2927.htm
最新版本请联系作者。
集团数据权限控制
横向理论
- 支持GroupParent/GroupCode 两级(业务数据加2个字段),分别对应基地部门1和用户所在部门2。
- 加基地部门标识【勾选】。
- 根据当前用户获取所在部门,再获取部门链编号,如:a,b,c.
- 根据当前用户所在的部门,检索数据 GroupCode IN (a,b,c,)
纵向理论
- 数据权限配置,支持组织架构以及个人配置。
- 展示部门负责人(支持 2个负责人),图标与普通员工区分。
- 配置部门时,默认给下面的所有员工配置列。
- 勾选的列表示可见。
- 表结构从字段名称管理获取
SqlCommandGenerator - SQL命令生成器
生成SQL原理, SqlCommandGenerator,生成3种SQL脚本及DbCommand实例。
实现逻辑:通过.NET反射ORM类的属性,根据属性定义,动态生成三种sql脚本。
ORM模型/ Model 重点部分
主表配置主键
[ORM_TableAttribute("tb_PO", "PONO", true)]
[ORM_ConcurrentAttribute("TS")] 并发控制
public sealed class tb_PO
{
public static string __TableName = "tb_PO";
public static string __KeyName = "PONO";
[ORM_FieldAttribute(DbType.Int32, 4, false, false, false, false, false)]
public static string ISID = "ISID";
[ORM_FieldAttribute(DbType.DateTime2, 8, false, false, false, false, false)]
public static string TS = "TS";
[ORM_FieldAttribute(DbType.String, 20, false, true, true, false, true)]
public static string PONO = "PONO";
明细表配置主键和外键
///<summary>
/// ORM模型, 数据表:tb_POs,由ClassGenerator自动生成
/// </summary>
[ORM_TableAttribute("tb_POs", "ISID", false)]
public sealed class tb_POs
{
public static string __TableName = "tb_POs";
public static string __KeyName = "ISID";
[ORM_FieldAttribute(DbType.Int32, 4, false, false, true, false, false)]
public static string ISID = "ISID";
[ORM_FieldAttribute(DbType.String, 20, false, true, false, true, false)]
public static string PONO = "PONO";
代码生成器,配置明细表重点
明细表必须配置主键+外键。
主从子表,三层表,层级表
参考:库存模块的《生产工艺》。代码生成器仅支持生成1层明细,既:主、从表。
提交多表时(DataSet)怎样数据采集?
什么是数据采集? 就是保存数据前将界面的数据组合到一个DataSet。
保存数据流程:UI数据采集 --> 调用BLL.Update(Dataset) --> DAL.Update(dataset) --> Database
提交数据重点:DAL.CreateSqlGenerator方法要对应ORM模型,根据表名对应,实现自动提交数据。
窗体、类命名规范(按功能名称排序)
比如:PO\SO
开发框架命名规范.pdf下载:
https://www.csframework.com/archive/1/arc-1-20130825-2063.htm
关于流水号码自动生成
- ORM模型的主键字段,设置 isDocFieldName =true;
- DAL层重写GetNumber方法。
每个DAL层必须重写CreateSqlGenerator方法
单张表的DAL层,比如客户资料、产品资料:
protected override IGenerateSqlCommand CreateSqlGenerator(DataTable table)
{
Type ORM = null;
if (table.TableName == tb_Customer.__TableName) ORM = typeof(tb_Customer);
if (ORM == null) throw new Exception(table.TableName + "表没有ORM模型!");
return new GenerateSqlCmdByTableFields(ORM, table, this.GeneratorFactory);
}
多张表的DAL层,采购订单、生产单:
/// <summary>
/// DAL层:根据表名获取该表的SQL命令生成器,提交多张表
/// </summary>
/// <param name="tableName">表名</param>
/// <returns></returns>
protected override IGenerateSqlCommand CreateSqlGenerator(DataTable table)
{
Type ORM = null;
if (table.TableName == DXD_PN.__TableName) ORM = typeof(DXD_PN);//主表ORM对应关系
if (table.TableName == DXD_PNDtlA.__TableName) ORM = typeof(DXD_PNDtlA); //明细表ORM对应关系
if (table.TableName == DXD_PNDtlB.__TableName) ORM = typeof(DXD_PNDtlB); //明细表ORM对应关系
if (table.TableName == DXD_PNDtlSub1.__TableName) ORM = typeof(DXD_PNDtlSub1); //明细表ORM对应关系
if (ORM == null) throw new Exception(table.TableName + "表没有ORM模型,请生成此表的Model类!");
return new GenerateSqlCmdByTableFields(ORM, table, this.GeneratorFactory);
}
CSFramework.DB.dll (数据库底层接口组件)
介绍:IDatabase 里面有4个meta_XXX接口,用于查询数据库元数据的接口。
代码生成器,生成SQL脚本要支持MySQL, 改@参数符号。
代码生成器,生成WCF接口到单独文件。
代码生成器,加选项:界面组件自适应。
开发文档:https://www.cscode.net/archive/csframework.db/1630589248.html
DbDataUpdate组件(已废弃,请使用DbFramework)
C/S框架网官网搜索文档,用于轻量级数据操作界面,Add/Edit/Delete对象实体操作。
参考:https://www.csframework.com/archive/1/arc-1-20210611-3587.htm
通过代码生成器生成标准的实体类模型,可用于DbDataUpdate组件操作。
DbFramework组件
参考文档:https://www.csframework.com/archive/1/arc-1-20210726-3732.htm
frmBaseXXX基类窗体里面重要的方法
InitButtons 初始化按钮。
ButtonStateChanged, 按钮状态改变触发的事件。
If (this.ButtonAuthorized(value):判断当前窗体是否拥有value参数的权限Value参数:权限值,2的n次方,如:1,2,4,8,16,32,…..
IButtonInfo接口,增加Visible属性
框架基类界面
1. frmBase 窗体基类
仅展示数据的,继承 frmBaseChild, 无增删改
处理单表数据的,继承 frmBaseDataDictionary
处理主从表数据的,继承 frmBaseBusiness
SetLanguage: 设置多语言,frmBase.SetLanguage(),框架默认封装三种语言,派生类可以重写 override 此方法,用于自定义设置组件的语言。
2. frmBaseModule 模块主窗体
SetMenuTag(): 给窗体分配最大的权限数值(可分配数值)
SetMenuButtonRelations():绑定菜单与按钮的对应关系, 菜单显示,按钮同样显示。
MdiTools.OpenChildForm: 打开子窗体.
特点:继承frmBaseModule 基类的窗体,作为业务模块的主窗体。
3. frmBaseDataDictionary 单表数据窗体
- InitButtons:初始化按钮。
- ButtonStateChanged:按钮状态改变时触发该事件。
- DoBindingSummaryEditor:自动绑定文本输入框的数据源。
4. frmBaseBusiness 主从表数据窗体
- InitButtons:初始化按钮。
- ButtonStateChanged:按钮状态改变时触发该事件。
- DoBindingSummaryEditor:自动绑定文本输入框的数据源。
- DoBindingDetailGrid:绑定明细表格的数据源。
- OnEmbeddedNavigatorButtonClick:明细表格操作按钮的click事件,支持Add,Insert,Delele。
- CreateOneDetail: 创建一条明细表记录。
- 明细表格. CellValueChanged事件:修改单元格的值触发的事件。常用计算逻辑,计算金额:Quantity*Price=Amount(Amount列设为只读,计算结果不支持修改)
5. frmBaseDialog 对话框窗体
6. frmMsgEx:自定义UI消息窗体。
frmMsgEx.ShowInformation(“您好!”);
frmMsgEx.ShowWarning(“显示警告消息!”);
文本输入框命名规则
文本框:txt+字段名
勾选框:chk+字段名
文本框赋值:SetEditorBindingValue(txt字段名,true);
文本输入框赋值方式
赋值差异:
txtCode.Text=”1111”; //给没有绑定数据源的文本框赋值
SetEditorBindingValue(txtCode,”1111”,true); //给绑定数据源的文本框赋值
CSFrameworkV5.DataAccess 数据访问层几个重要的方法
- DAL层Update方法(DataSet ds):
- DAL层Update方法(DataTable data):
- DAL层GetNumber方法,生成流水序号(单据号码);
动态加载模块
动态加载模块,怎样区分业务模块?
- 对dll文件过滤,区分dll文件名,使用通配符如:ERP*.dll,筛选:ERP1.dll,ERP2.dll等文件。
- Dll类库的程序集要定义AssemblyModuleEntry特性 (开发框架通过.NET反射获取该特性,判断是否业务模块)。
- Assembly.cs, AssemblyModuleEntry模块入口标识 (用于识别开发框架的模块)
动态加载dll流程
在debug目录查询CSFramework*.dll 查找AssemblyModuleEntry特性,满足这两个条件,自动加载该dll文件。
动态加载模块技术:.NET反射,.NET Reflecation。
参考:frmMain.InitUserInterface方法,LoadModules方法
账套管理与维护
系统库 tb_DataSet 表, IsVisible=Y, 登陆界面可选择账套。
DBUserPassword 对称加密, Rijndael , DES, DemoTester.exe加密。
常量改名注意事项
1.升级程序 Program.cs 文件内的常量改名
2.主程序 Globals.cs,替换:CSFramework,替换为您的项目名称,如:YourERP。
代码生成器 CodeGenerator
生成主从表界面注意事项
配置主表ORM
配置明细ORM
新开发的界面如何给用户分配权限
- 给菜单定义权限值。
- 给角色分配权限
- 给用户分配角色
- 权限值分类:
单表:AuthorityCategory.MASTER_ACTION ---- 核对菜单打开的界面必须继承frmBaseDatadict界面
主从表:AuthorityCategory.BUSINESS_ACTION_VALUE –>打开的界面必须继承frmBaseBusiness界面
报表:AuthorityCategory.REPORT_ACTION_VALUE
扩展权限:AuthorityCategory.MASTER_ACTION + ButtonAuthority.EX_01
扩展按钮
官网搜索关键词“扩展权限”。
扩展窗体中自定义按钮
http://www.csframework.com/archive/1/arc-1-20210722-3729.htm
扩展通用权限按钮(Toolbar中的按钮)
http://www.csframework.com/archive/5/arc-5-20110510-1465.htm
http://www.csframework.com/archive/1/arc-1-20161023-2266.htm
隐藏按钮: InitButtons方法的最后面加代码
_buttons.GetButtonByName("btnPrint").Visible = false;
WCF开发
WCF有三种承载(宿主,Hosting)方式,IIS, Win服务, SelfHosting自承载
IIS或自承载用于开发调试。
IIS承载(适用http/https协议)
配置web.config三个结点: bingings, services, behaviors
SQL连接字符串加密
Globals.asax文件的代码位置:App_Code\web_app.cs文件, 初始化Rij加密器。
关于协议与WCF结点绑定
HTTP/HTTPS协议:wsHttpBinding, basicHttpBinding
Net.tcp协议:nettcpBinding
WCF开发相关文档
Self Hosting自承载(适用http协议,开发环境调试)
https://www.csframework.com/archive/1/arc-1-20200217-2722.htm
Windows服务承载(适用http/https协议,生产环境)
http://www.csframework.com/archive/1/arc-1-20200212-2703.htm
WCF开发框架 - 采用wsHttpBinding及basicHttpBinding连接https协议的WCF服务
http://www.csframework.com/archive/1/arc-1-20210709-3707.htm
WCF快速开发框架 - IIS承载WCF服务wsHttpBindings配置详解(HTTP协议)
http://www.csframework.com/archive/1/arc-1-20210709-3705.htm
WCF快速开发框架 - IIS承载WCF http协议BasicTcpBinding配置详解
http://www.csframework.com/archive/1/arc-1-20210709-3704.htm
WCF快速开发框架 - IIS承载WCF net.tcp协议NetTcpBinding配置详解
http://www.csframework.com/archive/1/arc-1-20210709-3701.htm
WCF开发框架 - vs发布IIS承载(IIS Hosting)的WCF应用服务详解
http://www.csframework.com/archive/1/arc-1-20210709-3703.htm
WCF开发框架 - BasicHttpBinding绑定的web.config与C#代码配置(支持https协议)
http://www.csframework.com/archive/1/arc-1-20210708-3696.htm
WCF开发框架 - NetTcpBinding配置web.config与C#代码配置
http://www.csframework.com/archive/1/arc-1-20210708-3695.htm
WCF开发框架之WSHttpBinding参数配置(C#代码配置+App.Config两种方案)
http://www.csframework.com/archive/1/arc-1-20210707-3691.htm
WCF开发框架IIS承载WCF - Website站点承载改为ASP.NET网站应用程序承载
http://www.csframework.com/archive/1/arc-1-20210707-3693.htm
WCF开发框架之ICommunicationObject 对象详解
http://www.csframework.com/archive/1/arc-1-20210707-3690.htm
关于数据处理超时解决方案
若是WCF服务器,在Globals.cs
1.DatabaseFactory.CommandTimeOut = 10;//单位:秒,设置DbCommand命令执行超时;
若是直连模式
BridgeFactory.InitializeBridge()