.Net BP框架开发手册
AbpvNext项目学习(1)项目搭建及初始化

AbpvNext项⽬学习(1)项⽬搭建及初始化
找了好久ABP vNext的学习笔记,结果都没有⼼仪的博客,⼲脆⾃⼰研究ABP vNext官⽅⽂档。
⾸先是开发⼯具,⽂档上⾯要求:
1.VS2019
2. .Net Core
3.1
3.Node v12或v14
4.Yarn V1.20+ or npm v6+ (installed with Node)
当然,⽤其他编辑器也是可以的,看个⼈喜好
然后他提供了两种获取源码的⽅式:
1.安装Abp Cli,和Vue脚⼿架⼀样的东西,是⽤命令⾏安装(太⿇烦)
2.直接官⽹下载(简单直接)
唯⼀想吐槽的是,为什么它不⽀持Vue前端框架使⽤的是Angular。
我选择的是:Angular,EntityFramework Core,下载完成解压会有两个⽂件夹:
angular aspnet-core
⼀个前端,⼀个后台源码
运⾏后台项⽬后,需要⾸先⽣成类库,引进包,然后进⾏数据迁移
⽅法也有两种:
1.直接运⾏类库
2.包管理器控制台输⼊命令
官⽅⽀持第⼀种,也最简单粗暴
本⽂主要讲第⼀种
⾸先找到.DbMigrator类库,修改⾥⾯的appsetting.json,将连接字符串改成你⾃⼰的,并将其设成启动项(直接右键选择) 直接F5就可以⾃动进⾏数据迁移,完成后可以在数据库中看到你命名的数据库(注意:数据库可以⾃动⽣成,不需要新建)
然后将HttpApi.Host类库设成启动项,按Ctrl+F5运⾏项⽬,就可以看到Swagger界⾯了。
基于DDD的.NET开发框架-ABP模块设计

基于DDD的.NET开发框架-ABP模块设计ABP是“ Boilerplate Project (样板项⽬)”的简称。
Boilerplate是⼀个⽤最佳实践和流⾏技术开发现代WEB应⽤程序的新起点,它旨在成为⼀个通⽤的WEB应⽤程序框架和项⽬模板。
研究过orchard和nopcommerce的都应该知道模块概念,ABP的模块也和他们是⼀回事。
实现原理也都⼀样:应⽤程序⼀般都是先定义模块接⼝,然后把模块编译的dll放到固定的⽬录中(ABP只能放到bin下),应⽤程序主程序通过加载那些实现了插件接⼝的dll来实现插件的使⽤。
ABP 框架提供了创建和组装模块的基础,⼀个模块能够依赖于另⼀个模块。
在通常情况下,⼀个程序集就可以看成是⼀个模块。
在 ABP 框架中,⼀个模块通过⼀个类来定义,⽽这个类要继承⾃ AbpModule。
nopcommerce插件实现可以到:了解下。
下⾯的例⼦,我们开发⼀个可以在多个不同应⽤中被调⽤MybolgApplication模块,代码如下:public class MyBlogApplicationModule : AbpModule //定义{public override void Initialize() //初始化{IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());//这⾏代码的写法基本上是不变的。
它的作⽤是把当前程序集的特定类或接⼝注册到依赖注⼊容器中。
}}ABP框架会扫描所有的程序集,并且发现AbpModule类中所有已经导⼊的所有类,如果你已经创建了包含多个程序集的应⽤,对于ABP,我们的建议是为每⼀个程序集创建⼀个Module(模块)。
⽣命周期:在⼀个应⽤中,abp框架调⽤了Module模块的⼀些指定的⽅法来进⾏启动和关闭模块的操作。
我们可以重载这些⽅法来完成我们⾃⼰的任务。
ABP开发教程范文

ABP开发教程范文1.ABP基本概念ABP的核心概念是模块化和领域驱动设计。
在ABP中,应用程序被组织成多个模块,每个模块负责一个特定的功能或领域。
每个模块可以包含实体、服务、仓储、应用程序服务等组件。
2.ABP开发环境搭建3.创建模块在ABP中,可以通过使用命令行工具(ABPCLI)来创建新的模块。
首先,打开命令行窗口,导航到项目的根目录下。
然后运行以下命令来创建一个新的模块:dotnet abp create-module MyModule这将在项目中创建一个名为“MyModule”的新模块。
创建模块后,可以添加实体、服务、仓储等组件来实现模块的功能。
4.定义实体在ABP中,实体是应用程序的核心组件。
可以使用EF Core或Dapper等ORM工具来定义和操作实体。
在模块中,创建一个新的实体类,并定义其属性和关联关系。
例如,我们可以创建一个名为“Product”的实体类:public class Product : Entity<Guid>public string Name { get; set; }public decimal Price { get; set; }5.创建应用程序服务应用程序服务是用于实现业务逻辑的组件。
在ABP中,可以通过继承ApplicationService类来创建应用程序服务。
在模块中,创建一个新的应用程序服务类,并实现其方法。
例如,我们可以创建一个名为“ProductAppService”的应用程序服务:public class ProductAppService : ApplicationServiceprivate readonly IRepository<Product, Guid>_productRepository;public ProductAppService(IRepository<Product, Guid> productRepository)_productRepository = productRepository;}public async Task<List<ProductDto>> GetAllvar products = await _productRepository.GetAllListAsync(;return ObjectMapper.Map<List<ProductDto>>(products);}6.创建API控制器使用ABP创建一个API控制器非常简单。
ABPvNext微服务架构详细教程——分布式权限框架

ABPvNext微服务架构详细教程——分布式权限框架1.简介但是我们使⽤时会发现,对于正常的单体应⽤,ABP vNext框架提供的权限系统没有问题,但是在微服务架构下,这种权限系统并不是⾮常的友好。
我希望我的权限系统可以满⾜以下要求:1. 每个聚合服务持有独⽴的权限集合2. 每个聚合服务可以独⽴声明、使⽤其接⼝访问所需的权限。
3. 提供统⼀接⼝负责管理、存储所有服务权限并实现对⾓⾊的授权。
4. 每个接⼝可以灵活组合使⽤⼀个或多个权限码。
5. 权限框架使⽤尽量简单,减少额外编码量。
在ABP vNext框架基础上,重新编写了⼀套分布式权限框架,⼤体规则如下:使⽤ABP vNext框架中提供的⽤户、⾓⾊模型不做改变,替代重新定义权限模型,重新定义权限的实体及相关服务接⼝。
在⾝份管理服务中,实现权限的统⼀管理、⾓⾊授权和权限认证。
在聚合服务中定义其具有的权限信息、权限关系并通过特性声明各接⼝所需要的权限。
在聚合服务启动时,⾃动将其权限信息注册到⾝份管理服务。
客户端访问聚合服务层服务时在聚合服务层中间件中验证当前⽤户是否具有该接⼝权限,验证过程需调⽤⾝份管理服务对应接⼝。
权限系统具体实现见下⽂。
2. ⾝份认证服务在之前的⽂章中我们已经搭建了⾝份认证服务的基础框架,这⾥我们直接在此基础上新增代码。
在Demo.Identity.Domain项⽬中添加Permissions⽂件夹,并添加Entities⼦⽂件夹。
在此⽂件夹下添加实体类SysPermission和RolePermissions如下:using System;using ponentModel.DataAnnotations;using Volo.Abp.Domain.Entities;namespace Demo.Identity.Permissions.Entities;///<summary>///权限实体类///</summary>public class SysPermission : Entity<Guid>{///<summary>///服务名称///</summary>[MaxLength(64)]public string ServiceName { get; set; }///<summary>///权限编码///</summary>[MaxLength(128)]public string Code { get; set; }///<summary>///权限名称///</summary>[MaxLength(64)]public string Name { get; set; }///<summary>///上级权限ID///</summary>[MaxLength(128)]public string ParentCode { get; set; }///<summary>///判断两个权限是否相同///</summary>///<param name="obj"></param>///<returns></returns>public override bool Equals(object? obj){return obj is SysPermission permission&& permission.ServiceName == ServiceName&& == Name&& permission.Code == Code&& permission.ParentCode == ParentCode;}///<summary>///设置ID的值///</summary>///<param name="id"></param>public void SetId(Guid id){Id = id;}}using System;using Volo.Abp.Domain.Entities;namespace Demo.Identity.Permissions.Entities;///<summary>///⾓⾊权限对应关系///</summary>public class RolePermissions : Entity<Guid>{///<summary>///⾓⾊编号///</summary>public Guid RoleId { get; set; }///<summary>///权限编号///</summary>public Guid PermissionId { get; set; }}将Demo.Identity.Application.Contracts项⽬中原有Permissions⽂件夹中所有类删除,并添加⼦⽂件夹Dto。
ABP开发框架前后端开发系列---(1)框架的总体介绍

ABP开发框架前后端开发系列---(1)框架的总体介绍ABP是 Boilerplate的简称,ABP是⼀个开源且⽂档友好的应⽤程序框架。
ABP不仅仅是⼀个框架,它还提供了⼀个最徍实践的基于领域驱动设计(DDD)的体系结构模型。
学习使⽤ABP框架也有⼀段时间了,⼀直想全⾯了解下这个框架的整个来龙去脉,并把想把它使⽤历程整理成⼀个系列出来,不过⼀直没有下笔来写这篇⽂章的开篇,就是希望能够深⼊了解,再深⼊了解⼀些,希望⾃⼰能够理解透彻⼀些,不能误⼈⼦弟,也不想和⽹上千篇⼀律的翻译官⽹的内容,官⽹的英⽂介绍也已经很详细了,于是我觉得还是以实际使⽤的过程进⾏⼀定的整理会更好。
初次了解ABP框架,对它还是⾮常惊艳的,它基本上是.NET 领域架构的集⼤成者,⼏乎囊括了我们.NET领域排的上名的各种技术应⽤,⽽且它本⾝可以⽀持.net framework和.net core两种技术流派,对它的介绍也是⾮常感兴趣。
1)ABP框架的特点我们来⼤概了解下ABP框架涉及到的内容。
依赖注⼊,这个部分使⽤ Castle windsor (依赖注⼊容器)来实现依赖注⼊,这个也是我们经常使⽤IOC来处理的⽅式;Repository仓储模式,已实现了Entity Framework、NHibernate、MangoDB、内存数据库等,仓储模式可以快速实现对数据接⼝的调⽤;⾝份验证与授权管理,可以使⽤声明特性的⽅式对⽤户是否登录,或者接⼝的权限进⾏验证,可以通过⼀个很细粒度的⽅式,对各个接⼝的调⽤权限进⾏设置;数据有效性验证,ABP⾃动对接⼝的输⼊参数对象进⾏⾮空判断,并且可以根据属性的申请信息对属性的有效性进⾏校验;审计⽇志记录,也就是记录我们对每个接⼝的调⽤记录,以及对记录的创建、修改、删除⼈员进⾏记录等处理;Unit Of Work⼯作单元模式,为应⽤层和仓储层的⽅法⾃动实现数据库事务,默认所有应⽤服务层的接⼝,都是以⼯作单元⽅式运⾏,即使它们调⽤了不同的存储对象处理,都是处于⼀个事务的逻辑⾥⾯;异常处理,ABP框架提供了⼀整套⽐较完善的流程处理操作,可以很⽅便的对异常进⾏进⾏记录和传递;⽇志记录,我么可以利⽤Log4Net进⾏常规的⽇志记录,⽅便我们跟踪程序处理信息和错误信息;多语⾔/本地化⽀持,ABP框架对多语⾔的处理也是⽐较友好的,提供了对XML、JSON语⾔信息的配置处理;Auto Mapping⾃动映射,这个是ABP的很重要的对象隔离概念,通过使⽤AutoMaper来实现域对象和DTO对象的属性映射,可以隔离两者的逻辑关系,但是⼜能轻松实现属性信息的赋值;动态Web API层,利⽤这个动态处理,可以把Application Service 直接发布为Web API层,⽽不需要在累赘的为每个业务对象⼿⼯创建⼀个Web API的控制器,⾮常⽅便;动态JavaScript的AJax代理处理,可以⾃动创建Javascript 的代理层来更⽅便使⽤Web Api,这个在Web层使⽤。
abp框架常见增删改查实例

abp框架常见增删改查实例ABP( Boilerplate)是一种流行的开发框架,它提供了一套完整的解决方案,用于快速构建现代化的企业级应用程序。
在ABP 框架中,常见的操作包括增加(Create)、删除(Delete)、修改(Update)和查询(Retrieve)数据。
本文将通过几个实例来演示如何使用ABP框架进行常见的增删改查操作。
首先,我们来看一个简单的示例,演示如何使用ABP框架进行数据的增加操作。
假设我们有一个名为“Student”的实体类,包含学生的姓名、年龄和性别等信息。
我们可以通过以下代码来创建一个新的学生对象并将其保存到数据库中:```csharppublic async Task CreateStudent(string name, int age, string gender) {var student = new Student{Name = name,Age = age,Gender = gender};await _studentRepository.InsertAsync(student);}```在上述代码中,我们首先创建了一个新的学生对象,并设置其属性值。
然后,我们使用ABP框架提供的`InsertAsync`方法将学生对象插入到数据库中。
接下来,我们来看一个删除数据的示例。
假设我们要删除一个指定ID的学生对象。
我们可以通过以下代码来实现:```csharppublic async Task DeleteStudent(int id){var student = await _studentRepository.GetAsync(id);if (student != null){await _studentRepository.DeleteAsync(student);}}```在上述代码中,我们首先通过ID从数据库中获取到要删除的学生对象。
然后,我们使用ABP框架提供的`DeleteAsync`方法将学生对象从数据库中删除。
ABP框架使用(版本3.3.1)-EntityFramework

ABP框架使⽤(版本3.3.1)-EntityFrameworkpublic class Test : FullAuditedAggregateRootWithUser<Guid, AppUser>{public string TransactionNumber { get; set; }public virtual List<TestItem> TestItems { get; set; }}public class TestItem : AuditedEntity{public Guid TestId { get; set; }public Guid ItemId { get; set; }[ForeignKey("ItemId")]public Item Item { get; set; }public int Quantity { get; set; }public virtual List<TestSubItem> TestSubItems { get; set; }public override object[] GetKeys(){return new object[] { TestId,ItemId };}}public class TestSubItem : AuditedEntity{public Guid TestId { get; set; }public Guid ItemId { get; set; }[ForeignKey("TierId")]public Tier Tier { get; set; }public Guid TierId { get; set; }public int Quantity { get; set; }public override object[] GetKeys(){return new object[] { TestId, ItemId , TierId };}}1.当update TestItem的值,使⽤updateaync会报错2021-03-27 18:51:43.422 +08:00 [ERR] The instance of entity type 'TestSubItem' cannot be tracked because another instance with the same key value for {'TestId', 'ItemId', 'SubItemId'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.研究了好久,找不到⽅法override 这个类 StateManager.⽤下⾯改变 EntityState 的⽅法是有时凑效有时不凑效_context.Attach(modelPostedToController);IEnumerable<EntityEntry> unchangedEntities = _context.ChangeTracker.Entries().Where(x => x.State == EntityState.Unchanged);foreach(EntityEntry ee in unchangedEntities){ee.State = EntityState.Modified;}await _context.SaveChangesAsync();最后的解决⽅案是先 remove 再 update, ⽽且⼀定不能⽤ DbContext.SaveChangesAsync()要是⽤aynchu会报错public class TestItemRepository : EfCoreRepository<DRSDbContext, TestItem>, ITestItemRepository{public TestItemRepository(IDbContextProvider<DRSDbContext> dbContextProvider) : base(dbContextProvider){}public Task Save(List<TestItem> entities){DbContext.AttachRange(entities);DbContext.UpdateRange(entities);DbContext.SaveChanges();return pletedTask;}public Task Remove(List<TestItem> entities){DbContext.AttachRange(entities);DbContext.RemoveRange(entities);DbContext.SaveChanges();return pletedTask;}}2.当update sub entity的时候,如果sub entity有soft delete的话就会报duplicate key错。
ABP框架模板开发手册

ABP框架模板开发手册杭州蒙特信息技术有限公司2018年1月目录1ABP框架介绍 (3)1.1ABP简介 (3)1.2ABP多层结构 (3)1.3ABP环境 (5)1.4开发环境 (5)2搭建网站 (5)2.1获取源码 (5)2.2搭建数据库 (6)2.3搭建站点 (8)3模块开发 (9)3.1领域层 (9)3.2应用层 (18)4后台页面 (22)5前台页面 (27)6后台配置....................................................................................................错误!未定义书签。
1ABP框架介绍1.1ABP简介我们总是对不同的需求开发不同的应用。
但至少在某些层面上,一次又一次地重复实现通用的和类似的功能。
如:授权,验证,异常处理,日志,本地化,数据库连接管理,设置管理,审核日志等功能。
所以我们创建架构和最佳实践,如分层和模块架构,DDD,依赖注入等,并尝试开发应用时基于一些约定。
由于所有这些是非常耗时而且很难单独创建并可适用于每个项目,许多公司创建自己的框架,他们用自己的框架能快速开发新应用而且不出错。
但不是所有的公司都是幸运的,大部分公司没有时间,预算和团队来开发好的框架。
他们甚至都没有可能创建一个框架,因为编写文档,培训开发人员和维护框架都是非常困难的。
Boilerplate (ABP) 是一个开源并且有丰富文档的应用框架,开发宗旨是:“为所有公司,所有开发人员,开发出一个通用框架!”,而且不只是一个框架,同时提供一个强大的基于DDD的构架模型和最佳实践。
1.2ABP多层结构一个应用的代码库的分层是一个广为接受的技术,用来减少复杂度和提高代码复用性。
ABP依照DDD理念来分层,在DDD里有4个基本的层:•表示层:为用户提供一个界面。
使用应用层来完成用户交互。
•应用层:表示层与领域层的媒介。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BPFrameWork框架技术手册济南驰骋信息技术有限公司2012/5/5目录1总体说明 (3)1.1 总体说明 (3)1.2映射机制 (3)1.3架构图 (5)1.3.1应用程序架构 (5)1.3.2 BP架构案例图 (5)2底层类库BP.En30.dll (7)2.1数据访问层BP.DA (7)2.1.1运行SQL与存储过程 (7)2.1.3写入日志 (9)2.1.4其它 (9)2.2实体层BP.En (10)2.2.1实体继承图 (10)2.2.2实体基础操作 (15)2.2.3实体集合操作 (17)2.3系统类库BP.Sys (19)2.4组织结构类库BP.Port (20)2.4.1组织结构表 (20)2.4.2组织结构相关操作 (21)3 控件层类库BP.Web.Contral.dll (22)4 前台Web应用 (22)4.1前台类库App_Coder (22)4.2通用组件Comm (22)4.2.1查询模式 (22)4.2.2批处理模式 (23)4.2.3增删改查模式 (23)4.2.4分组分析模式 (23)4.2.5对比分析模式 (24)4.3其它系统文件夹 (24)4.3.1系统数据文件夹Data (24)4.3.2用户数据文件夹DataUser (24)4.3.3图片文件夹Images (24)5演示案例说明 (24)3.1映射机制: (24)3.2组件研究( M-4): (24)第1类:抽象组件 (24)第2类:抽象业务组件(多应用于web网站类的项目) (27)第3类:机制类组件(多应用于web网站类的项目) (27)第4类:控件(多应用于web网站类的项目) (28)1总体说明1.1总体说明BP框架是一个简单、简洁、灵活的开源框架。
利用BP框架可以方便的书写表单你的业务逻辑。
目前复杂的ccflow就是建立在BP框架上。
BP框架目前来说,善于处理MIS系统上的复杂业务逻辑表述与MIS系统的开发。
使用BP框架可以节省大量重复劳动。
BP框架的核心基础是映射。
在映射的基础上创建出来各种抽象模块的应用,可以为我们的项目开发奠定基础。
1.2映射机制这里提出的映射概念已经不单单是类的属性与表结构的映射。
它涉及UI层的映射(查询条件,数据显示顺序与方式)、外键与枚举类型的映射、实体与实体的映射(包含两种:明细与多对多的映射)、方法的映射。
以及基础信息映射设置。
本人认为映射是实现可复用的基础。
对于映射的机制有如下三种:以上三种各有优缺点,大家通常认为,1,2两种方式常被人所理解。
但是在我看来第三种方式最值得提倡。
因为它的表达方式很灵活。
第2种经常被用在属性变长属性应用里。
比如工作流表单设计,商品属性设计中。
把2,3两种方式的优点结合,这方面的功能还没有开发。
map.AddTBStringPK(StuAttr.No, null, "学号", true, false, 4, 4, 4); //增加一个主键 map.AddTBString(, null, "名称", true, false, 0, 50, 300);map.AddDDLSysEnum(StuAttr.XB, 0, "性别", true, true, "XB", "@0=女@1=男"); //增加一个枚举。
map.AddTBString(StuAttr.Tel, null, "电话", true, false, 0, 200, 300);map.AddTBString(StuAttr.Addr, null, "地址", true, false, 0, 50, 300,true); //让这个TextBox 占正行显示。
map.AddTBDate(StuAttr.BDT, null, "出生日期", true, false);map.AddDDLEntities(StuAttr.FK_BJ, null, "班级", new BJs(), true); //增加一个外键。
map.AddTBStringDoc(StuAttr.Doc, null, "介绍", true, false);map.AddMyFile("照片"); //增加一个附件,可以增加多个附件。
map.AddSearchAttr(StuAttr.FK_BJ); //查询条件映射map.AddSearchAttr(StuAttr.XB); //查询条件映射map.AddDtl(new StuDtls(), StuDtlAttr.FK_Stu); //明细表的映射map.AttrsOfOneVSM.Add(new StuKMs(), new KMXXs(), StuKMAttr.FK_Stu,StuKMAttr.FK_KM,, KMAttr.No, "选修科目");//多对多的关系映射#region方式映射。
RefMethod rm = new RefMethod();rm.Title = "一户式资料";rm.ClassMethodName = this.ToString() + ".DoOpen";map.AddRefMethod(rm);rm = new RefMethod();rm.Title = "导入\\导出";rm.Warning = "确定要执行吗?";rm.IsForEns = false;rm.IsCanBatch = true;rm.ClassMethodName = this.ToString() + ".DoDataIO";map.AddRefMethod(rm);//带有参数的方法。
rm = new RefMethod();rm.Title = "分班";rm.IsForEns = false;rm.IsCanBatch = true;rm.HisAttrs.AddDDLEntities("FK_BJ", null, "选择班级", new BJs(),true);rm.HisAttrs.AddTBString("Note",null,"说明",true,false,0,20,20);rm.ClassMethodName = this.ToString() + ".DoFB";map.AddRefMethod(rm);以上的映射包含了6个方面:1,实体类与物理表字段的映射。
2,实体类的属性在组件中显示方式的映射。
3,实体类属性关系的映射。
4,实体类查询条件映射。
5,多对多的关系映射。
6,方法的映射(带有参数与没有参数的)。
1.3架构图1.3.1应用程序架构1.3.2 BP架构案例图以下两个案例图就是CC开源的产品。
1.4类设计与数据库设计命名规则总体规则1,以英文命名,每一个字母大写,提倡用简写。
比如Emp 人员Dept 部门Station 岗位。
2,如果英文名称太长,或者不常用可考虑用中文命名,建议用中文的缩写。
比如管理机关GLJG。
3,对于类与表的命名必须有前缀,比如BP.Port.Dept 类名,表名为Port_Dept.。
4,前缀命名尽量简单。
比如考核命名空间英文名称为Check 空间可以命名为CH。
共用的类英文名称为Public 可简写为Pub.类库设计规则:1,格式为BP+前缀+类名。
比如:BP.Port.Emp 人员类。
2,属性命名与字段命名相同。
特殊属性可以遵守总体命名规则。
3,类库的倒数第一个命名空间要与要与物理表的前缀一致。
比如:物理表考核项目。
BP.CH.CheckIiems。
物理表为CH_CheckItem。
4,如果一个属性是外部实体或者枚举类型,以His 开头。
比如在类人员中的部门类HisDept. 5,方法命名规则,遵守总体命名规则的第1,2条。
6,变量的命名规则,字母小写,以下划线开头。
比如:age 年龄。
addr 地址。
要求每一行都要有注释。
数据库设计命名规则:1, 物理表命名格式前缀+“_”+对应的类名。
部门操作员Port_Emp, Port_Dept ,CH_CheckItem. WF_Flow。
2,视图命名格式。
“V_”+ 前缀+ “_”+对应的类名。
V_CH_CheckItemExt。
3, 存储过程命名规则“Pro_”+ 前缀+ “_”+过程名称. 比如Pro_Sys_Init.4,函数命名规则“Fun”+ 前缀+ “_”+函数名. 比如:Fun_Sys_GenerOID.5, 外键字段命名规则“FK_”+对应的物理表类名. 比如:在人员表(Port_Emp)中表示部门的字段FK_Dept. 同事一看就知道,这个字段是外键,并且它的对应到Dept这个类的物理表上。
6, 取消日期与日期时间类型的字段,用string类型字段表示日期类型,日期格式为yyyy-MM-dd HH:mm 时间格式为: yyyy-MM-dd HH:mm.7, 取消boolen类型字段应int类型表示1表示true,0表示false. Boolen类型必须以Is开头比如:IsPass是否通过。
IsEnable 是否禁用。
8, 对于枚举类型的字段用int类型表示,分别存储在Sys_Enum 与Sys_EnumMain表里。
9, 新设计的主键表必须以MyPK,OID,No 三种名称命名(多对多的实体除外)。
2底层类库BP.En30.dllBP.En30.dl 是一个基层的开源类库,CC所有的项目都把这个层放在最底部。
2.1数据访问层BP.DADA 是data access 的缩写,在这个命名空间里的类担负着执行与数据库交互的使命。
开发人员在前台书写业务逻辑时直接按照定义的来调用。
除此之外一些通用性的函数与放在这个命名空间下了。
比如:访问excel 文件,字符集的处理,人民币大写的转换,汉字到拼音的转换。
日志类库的记录等等,字串的转换。
2.1.1运行SQL与存储过程2.1.3写入日志BP会按日期日期生成一个文件放在D:\ccflow\VisualFlow\DataUser\Log目录下根据写入日志的内容我们分如下几种类型:提示信息:比如: 14日12时35分26秒Info:System');"成功[BP.Port.Emp-13]放入缓存。