平台下载地址:https://gitee.com/alwaysinsist/edp


业务模型概述

业务模型管理中所涉及的业务模型,业务模型的属性,业务模型的视图都是可以通过权限设置来实现数据的行(视图),列(属性)权限管控。业务模型是整个EDP平台的核心基础,数据的查询、新增、修改、删除、行列权限都是通过业务模型来实现的。

业务模型管理

按分类管理系统内各个业务模型,对应系统中各个业务对象。

业务模型分类

管理业务模型分类。

业务模型

  • 新增业务模型



  • 编辑业务模型





  • 业务模型代码生成



    表设计文档模板,可以包含多个表结构设计

业务模型开发

定义业务模型

创建业务模型类,继承基类ModelPermissionBase。定义好的业务模型可以在上述的业务模型管理功能中进行管理,实现数据行、列权限的管控。

点击查看代码
using System;

namespace School.Model
{
using EDP.Common.Model;
using EDP.Common.Help; using EDP.Database;
using EDP.Framework; using EDP.Authentication; /// <summary>
/// 学生业务对象
/// </summary>
[ModelEnitity(TableName = "t_school_student", KeyName = "ID")]
public class StudentModel: ModelPermissionBase
{
/// <summary>
/// 构造函数
/// </summary>
public StudentModel() {
this.SetDefaultQuerySQL(@"select *
from (select a.ID
,a.Name
,a.Number
,a.GenderId
,a.Age
,a.Contact
,a.ContactMobile
,a.Hobby
,a.CampusId
,a.ClassId
,a.CreateUserId
,a.CreateUserName
,a.CreateDepartmentId
,a.CreateOrganizationId
,a.CreateTime
,a.ModifyUserId
,a.ModifyUserName
,a.ModifyTime
,a.Remarks
,b.Name CampusName
,c.Name ClassName
,d.Name SchoolName
,c.FullCode ClassFullCode
from t_school_student a
left join t_sys_organization_unit b on a.CampusId = b.ID
left join t_sys_organization_unit c on a.ClassId = c.ID
left join t_sys_organization_unit d on c.FullCode like d.FullCode + '%' and d.Levels = c.Levels - 3) tab");
} #region **----实体属性---------------------------**
/// <summary>
/// 主键ID
/// </summary>
[ModelEnitity(ColumnName = "ID")]
public string ID { get; set; } /// <summary>
/// 姓名
/// </summary>
[ModelEnitity(ColumnName = "Name", IsRequired = true, MaxLength = 50)]
public string Name { get; set; } /// <summary>
/// 编号
/// <summary>
[ModelEnitity(ColumnName = "Number")]
public string Number { get; set; } /// <summary>
/// 性别ID
/// </summary>
[ModelEnitity(ColumnName = "GenderId", IsRequired = true)]
public int? GenderId { get; set; } /// <summary>
/// 年龄
/// </summary>
[ModelEnitity(ColumnName = "Age", IsRequired = true)]
public int? Age { get; set; } /// <summary>
/// 联系人
/// </summary>
[ModelEnitity(ColumnName = "Contact", MaxLength = 50)]
public string Contact { get; set; } /// <summary>
/// 联系人手机
/// </summary>
[ModelEnitity(ColumnName = "ContactMobile", Regex = @"^[1]([3-9])[0-9]{9}$")]
public string ContactMobile { get; set; } /// <summary>
/// 兴趣爱好
/// </summary>
[ModelEnitity(ColumnName = "Hobby", MaxLength = 500)]
public string Hobby { get; set; } /// <summary>
/// 校区ID
/// </summary>
[ModelEnitity(ColumnName = "CampusId")]
public string CampusId { get; set; } /// <summary>
/// 班级ID
/// </summary>
[ModelEnitity(ColumnName = "ClassId", IsRequired = true)]
public string ClassId { get; set; } /// <summary>
/// 创建人ID
/// </summary>
[ModelEnitity(ColumnName = "CreateUserId")]
public string CreateUserId { get; set; } /// <summary>
/// 创建人
/// </summary>
[ModelEnitity(ColumnName = "CreateUserName")]
public string CreateUserName { get; set; } /// <summary>
/// 创建部门ID
/// </summary>
[ModelEnitity(ColumnName = "CreateDepartmentId")]
public string CreateDepartmentId { get; set; } /// <summary>
/// 创建机构ID
/// </summary>
[ModelEnitity(ColumnName = "CreateOrganizationId")]
public string CreateOrganizationId { get; set; } /// <summary>
/// 创建时间
/// </summary>
[ModelEnitity(ColumnName = "CreateTime")]
public DateTime? CreateTime { get; set; } /// <summary>
/// 修改人ID
/// </summary>
[ModelEnitity(ColumnName = "ModifyUserId")]
public string ModifyUserId { get; set; } /// <summary>
/// 修改人
/// </summary>
[ModelEnitity(ColumnName = "ModifyUserName")]
public string ModifyUserName { get; set; } /// <summary>
/// 修改时间
/// </summary>
[ModelEnitity(ColumnName = "ModifyTime")]
public DateTime? ModifyTime { get; set; } /// <summary>
/// 备注
/// </summary>
[ModelEnitity(ColumnName = "Remarks", MaxLength = 1000)]
public string Remarks { get; set; }
#endregion #region **----扩展属性---------------------------**
/// <summary>
/// 校区名称
/// </summary>
public string CampusName { get; set; } /// <summary>
/// 学校名称
/// </summary>
public string SchoolName { get; set; } /// <summary>
/// 班级名称
/// </summary>
public string ClassName { get; set; } /// <summary>
/// 性别@readonly
/// </summary>
public GenderEnum Gender {
get {
GenderEnum ret = GenderEnum.None;
if (this.GenderId.HasValue) {
try { ret = (GenderEnum)this.GenderId; }
catch { }
}
return ret;
}
} /// <summary>
/// 性别显示@readonly
/// </summary>
public string GenderDisplay {
get {
return EnumHelp.GetEnumDescription(this.Gender);
}
} /// <summary>
/// 班级全编码
/// </summary>
public string ClassFullCode { get; set; } /// <summary>
/// 学校
/// </summary>
public Organization.OrganizationModel School { get; set; } = new Organization.OrganizationModel();
#endregion #region **----方法-------------------------------**
/// <summary>
/// 创建当前实体对象
/// </summary>
/// <param name="db">数据库接口</param>
public void Create(IDBInstance db = null) {
if (string.IsNullOrWhiteSpace(this.ID))
this.ID = Guid.NewGuid().ToString(); var loginUser = AuthenticationHelp.GetLoginUser(db);
if (loginUser != null && loginUser.IsLogin) {
this.CreateUserId = loginUser.UserInfo.ID;
this.CreateUserName = loginUser.UserInfo.Name;
this.CreateDepartmentId = loginUser.UserInfo.DepartmentId;
this.CreateOrganizationId = loginUser.UserInfo.OrganizationId;
} this.CreateTime = DateTime.Now;
this.ModifyTime = null;
this.ModifyUserId = null;
this.ModifyUserName = null;
} /// <summary>
/// 修改当前实体对象
/// </summary>
/// <param name="db">数据库接口</param>
public void Modify(IDBInstance db = null) {
this.ModifyTime = DateTime.Now; var loginUser = AuthenticationHelp.GetLoginUser(db);
if (loginUser != null && loginUser.IsLogin) {
this.ModifyUserId = loginUser.UserInfo.ID;
this.ModifyUserName = loginUser.UserInfo.Name;
} this.ModifyTime = DateTime.Now;
this.CreateDepartmentId = null;
this.CreateOrganizationId = null;
this.CreateTime = null;
this.CreateUserId = null;
this.CreateUserName = null;
} /// <summary>
/// 修改当前实体对象
/// </summary>
/// <param name="keyValue">主键值</param>
/// <param name="db">数据库接口</param>
public void Modify(string keyValue, IDBInstance db = null) {
this.ID = keyValue;
this.Modify(db);
}
#endregion
}
}

[ModelEnitity(TableName = "t_school_student", KeyName = "ID")]

TableName:表名

KeyName:主键对应的属性名

[ModelEnitity(ColumnName = "Name", IsRequired = true, MaxLength = 50)]

ColumnName:字段名称

IsRequired:是否必须,用于验证属性值是否必须有值

MaxLength:最大长度,属性值的最大长度

[ModelEnitity(ColumnName = "ContactMobile", Regex = @"^[1]([3-9])[0-9]{9}$")]

Regex:正则表达式,用于验证属性值格式

点击查看代码
/// <summary>
/// 构造函数
/// </summary>
public StudentModel() {
this.SetDefaultQuerySQL(@"select *
from (select a.ID
,a.Name
,a.Number
,a.GenderId
,a.Age
,a.Contact
,a.ContactMobile
,a.Hobby
,a.CampusId
,a.ClassId
,a.CreateUserId
,a.CreateUserName
,a.CreateDepartmentId
,a.CreateOrganizationId
,a.CreateTime
,a.ModifyUserId
,a.ModifyUserName
,a.ModifyTime
,a.Remarks
,b.Name CampusName
,c.Name ClassName
,d.Name SchoolName
,c.FullCode ClassFullCode
from t_school_student a
left join t_sys_organization_unit b on a.CampusId = b.ID
left join t_sys_organization_unit c on a.ClassId = c.ID
left join t_sys_organization_unit d on c.FullCode like d.FullCode + '%' and d.Levels = c.Levels - 3) tab"); //引入命名空间 using EDP.Common;
//default:注册表配置中数据库连接配置所对应的"Key"值
//若没有设置连线字串,则取注册表配置中的默认数据库连接
//this.SetConnectionString(Config.Database["default"]); 示例项目使用默认数据库连接,不需要设置
}

在构造函数中通过SetDefaultQuerySQL()方法设置默认查询SQL,通过SetConnectionString()方法设置数据库连接字符串(若没设置则取默认数据库连接字串)。

public string CampusName { get; set; }

扩展属性是默认查询SQL中所查询的非业务模型映射的表中的字段。

点击查看代码
/// <summary>
/// 创建当前实体对象
/// </summary>
/// <param name="db">数据库接口</param>
public void Create(IDBInstance db = null) {
if (string.IsNullOrWhiteSpace(this.ID))
this.ID = Guid.NewGuid().ToString(); var loginUser = AuthenticationHelp.GetLoginUser(db);
if (loginUser != null && loginUser.IsLogin) {
this.CreateUserId = loginUser.UserInfo.ID;
this.CreateUserName = loginUser.UserInfo.Name;
this.CreateDepartmentId = loginUser.UserInfo.DepartmentId;
this.CreateOrganizationId = loginUser.UserInfo.OrganizationId;
} this.CreateTime = DateTime.Now;
this.ModifyTime = null;
this.ModifyUserId = null;
this.ModifyUserName = null;
} /// <summary>
/// 修改当前实体对象
/// </summary>
/// <param name="db">数据库接口</param>
public void Modify(IDBInstance db = null) {
this.ModifyTime = DateTime.Now; var loginUser = AuthenticationHelp.GetLoginUser(db);
if (loginUser != null && loginUser.IsLogin) {
this.ModifyUserId = loginUser.UserInfo.ID;
this.ModifyUserName = loginUser.UserInfo.Name;
} this.ModifyTime = DateTime.Now;
this.CreateDepartmentId = null;
this.CreateOrganizationId = null;
this.CreateTime = null;
this.CreateUserId = null;
this.CreateUserName = null;
} /// <summary>
/// 修改当前实体对象
/// </summary>
/// <param name="keyValue">主键值</param>
/// <param name="db">数据库接口</param>
public void Modify(string keyValue, IDBInstance db = null) {
this.ID = keyValue;
this.Modify(db);
}

在业务对象上提供Create()和Modify()扩展方法,用于在创建和修改业务时调用,给业务对象必要属性赋值。

定义查询对象

查询对象是用来实现业务对象的查询,通过属性来设置查询条件。需要继承QueryModelBase基类。

点击查看代码
using System;

namespace School.Model
{
using EDP.Common;
using EDP.Common.Model; /// <summary>
/// 学生信息查询对象
/// </summary>
[QueryModel] //标记类的查询对象特性
public class StudentQueryModel : QueryModelBase //继承QueryModelBase
{
/// <summary>
/// 姓名
/// </summary>
[QueryModel(Operator = QueryOperator.like, ColumnName = "Name")]
public string Name { get; set; } /// <summary>
/// 性别
/// </summary>
[QueryModel(Operator = QueryOperator.eq, ColumnName = "GenderId")]
public int? GenderId { get; set; } /// <summary>
/// 校区
/// </summary>
[QueryModel(Operator = QueryOperator.eq, ColumnName = "CampusId")]
public string CampusId { get; set; } /// <summary>
/// 班级
/// </summary>
[QueryModel(Operator = QueryOperator.eq, ColumnName = "ClassId")]
public string ClassId { get; set; } /// <summary>
/// 班级全编码
/// </summary>
/// <example>ClassFullCode like '值%'</example>
[QueryModel(Operator = QueryOperator.likeRight, ColumnName = "ClassFullCode")]
public string ClassFullCode { get; set; } /// <summary>
/// 编号姓名关键字
/// Number和Name都进行like查询
/// </summary>
/// <example>Number like '%关键字%' or Name like '%值%'</example>
[QueryModel(Operator = QueryOperator.like, ColumnNameList = "Number;Name")]
public string NumberNameKeywrod { get; set; } /// <summary>
/// 分页对象
/// </summary>
public PageModel Page { get; set; } = new PageModel();
}
}

[QueryModel(Operator = QueryOperator.like, ColumnName = "Name")]

Operator:查询操作符(=、>、<、>=、like等)

ColumnName:对应业务对象的属性(实体属性,扩展属性),只要是默认查询SQL中包含的字段都可以作为查询对象的属性(查询条件)

业务模型使用

详见示例项目StudentBLL.cs

  • 业务模型属性验证

    var verify = item.Verify(keyValue);

    此处通过Verify()方法验证业务模型各属性值,通过属性验证标记(IsRequired,MaxLength, Regex)进行验证。

  • 业务模型新增

点击查看代码
item.Create(db);
item.ValidateSQL = string.Format("where not exists (select 1 from t_school_student where Number = '{0}')", item.Number);
result = item.InsertModel(db);
通过业务模型Create()方法创建当前实体对象。
通过ValidateSQL属性值确保不会有重复的Number值插入到数据库。
调用InsertModel()方法新增业务模型数据。
  • 修改业务模型
点击查看代码
item.Modify(keyValue, db);
item.Number = null; //编号不能修改
result = item.UpdateModel(db);
通过业务模型Modify()方法修改当前实体对象。
调用UpdateModel()方法修改业务模型数据。
  • 业务模型查询
点击查看代码
ResultModel<StudentModel> ret = new ResultModel<StudentModel>();
ret.Content = new StudentModel();
ret.KeyValue = keyValue;
ret.Content.ID = keyValue;
ret.Content.Query(db);
使用统一的返回对象 ResultModel<StudentModel>。
实例化ret.Content并设置操作的主键值ret.KeyValue = keyValue。
设置查询的主键值 ret.Content.ID = keyValue。
调用业务对象Query()方法 ret.Content.Query(db)。
执行Query()查询后,根据权限设置给ret.Content赋值。
ret.Content.AccessPropertyList中返回有权限的属性名称。
  • 业务模型列表查询
点击查看代码
ResultModel<List<StudentModel>> ret = new ResultModel<List<StudentModel>>();
ret.Content = new List<StudentModel>();
ret.Content.Query(queryModel.Page, queryModel, db);
ret.Page = queryModel.Page;
使用统一的返回对象 ResultModel<List<StudentModel>>。
实例化 ret.Content = new List<StudentModel>()。
调用业务对象Query()方法 ret.Content.Query(queryModel.Page, queryModel, db)。
queryModel为查询对象StudentQueryModel的实例。
执行Query()查询后,根据权限设置给ret.Content赋值(有权限的数据集合)。
ret.Content[0].AccessPropertyList中返回有权限的属性名称。
  • 业务模型删除
点击查看代码
StudentModel item = new StudentModel();
item.Id = keyValue;
item.DeleteModel();
实例化StudentModel。
设置主键值 item.Id = keyValue。
调用业务对象DeleteModel()方法 item.DeleteModel()。

EDP .Net开发框架--业务模型的更多相关文章

  1. 从EF的使用中探讨业务模型能否脱离单一存储层完全抽象存在

    上次赶时间,就很流水账地写了上次项目对EF的一次实践应用模式,因为太长了,也没能探讨太多,所以再继续扩展. 这次想探讨的是,实体,如果作为类似于领域模型的业务模型存在,它的数据能否来自不同的数据源.这 ...

  2. 分析业务模型-类图(Class Diagram)

    分析业务模型-类图(Class Diagram)     分析业务模型-类图(Class Diagram)(上) 摘要:类图(Class Diagram)可能是用得最多的一种UML图.类图的基本语法并 ...

  3. BIEE入门(三)业务模型层

    正如它的名字所示(Business Model and Mapping Layer),业务逻辑层需要把物理层的数据源以一种业务用户的视角来重新组织物理层的各个数据源(所谓的Mapping),同时在业务 ...

  4. How to: Create a Business Model in the XPO Data Model Designer 如何:在 XPO 数据模型设计器中创建业务模型

    This topic provides step-by-step instructions on how to use the XPO Data Model Designer in XAF appli ...

  5. BW ON HANA 业务模型关系与数据取数

    在接到业务需求之后,我认为重要的是理清楚自己该做什么.来实现业务.由于不了解业务,还是走了很多弯路.本可以不用这么做,还是这么做了.自然你最傻瓜的按照用户的方式去实现是没有问题的. 会使后面的人难以维 ...

  6. HL AsySocket 服务开发框架 - 业务逻辑层

    一 概述 Socket服务只是提供一个网络传输服务. 业务逻辑层在整体架构中的位置在那里呢,如图: 网络层将解包后的消息包抛至业务逻辑层,业务逻辑层收到消息包后,解析消息类型,然后转入相应的处理流程处 ...

  7. 《火球——UML大战需求分析》(第3章 分析业务模型-类图)——3.8 小结与练习

    摘要:类图(Class Diagram)可能是用得最多的一种UML图.类图的基本语法并不复杂,你可能最多学习两三天就可以掌握,然而要真正做到活用类图则可能需要几年的功力.类图是锻炼面向对象分析(OOA ...

  8. 【重磅】iNeuOS工业互联平台,系统集成业务模型和WEB组态视图建模集成3D模型

    目       录 1.      概述... 1 2.      平台演示... 2 3.      系统集成业务模型... 2 4.      WEB组态视图建模集成3D模型... 3 5.    ...

  9. 《HiWind企业快速开发框架实战》(0)目录及框架简介

    <HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...

  10. 《HiWind企业快速开发框架实战》(3)使用HiWind创建和管理菜单

    <HiWind企业快速开发框架实战>(3)使用HiWind创建和管理菜单 关于HiWind HiWind企业快速开发框架,是基于.NET+EasyUi(支持各种前端扩展,后面将扩展Boot ...

随机推荐

  1. C# 方法详解:定义、调用、参数、默认值、返回值、命名参数、方法重载全解析

    C# Methods 方法是一段代码,只有在调用时才会运行. 您可以将数据(称为参数)传递给方法. 方法用于执行某些操作,也被称为函数. 为什么使用方法?为了重用代码:定义一次代码,然后多次使用. 创 ...

  2. Go 语言中结构体的使用和示例

    结构体(简称struct)用于创建不同数据类型的成员集合,放入一个单一的变量中.虽然数组用于将相同数据类型的多个值存储在单一变量中,但结构体用于将不同数据类型的多个值存储在单一变量中.结构体对于将数据 ...

  3. keycloak~RequiredActionProvider的使用

    使用场景 RequiredActionProvider,它是在认证过程中,需要当前登录的用户执行个性化的动作:当用户符合条件,就被执行RequiredActionProvider对作,当Require ...

  4. k8s之存储卷OpenEBS

    一.OpenEBS简介 OpenEBS 是一种开源云原生存储解决方案,托管于 CNCF 基金会,目前该项目处于沙箱阶段. OpenEBS能够将Kubernetes工作节点上可用的住何存储转换为术卷或分 ...

  5. 重新点亮linux 命令树————二进制安装[十一八]

    前言 简单介绍一下二进制安装 正文 wget https://openresty.org/download/openresty-1.15.8.1.tar.gz tar -zxf openresty-V ...

  6. TaskPool 和 Worker 的对比

    作用: TaskPool(任务池)和 Worker 都为应用程序提供多线程运行环境,用于处理耗时的计算任务或其他密集型任务,避免阻塞主线程,提高系统性能.   实现特点对比: 内存模型:TaskPoo ...

  7. uniapp中实现简易计算器

    uniapp中实现简易计算器主要问题:在计算器的实现过程中会遇到小数点计算精度:此计算器是依赖了uni-popup的弹出层插件,可在uniapp官方组件中查找扩展插件popup弹窗层下载,也可直接点击 ...

  8. 《c#高级编程》第3章C#3.0中的更改(五)——扩展方法

    C#扩展方法是一种语法,可以为已有的类添加新的实例方法,而无需修改原来的类定义.它的语法形式为: ```csharppublic static void MyExtensionMethod(this ...

  9. 力扣645(java)-错误的集合(简单)

    题目: 集合 s 包含从 1 到 n 的整数.不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 . 给定一个数组 nu ...

  10. 力扣405(java)-数字转换为十六进制(简单)

    题目: 给定一个整数,编写一个算法将这个数转换为十六进制数.对于负整数,我们通常使用 补码运算 方法. 注意: 十六进制中所有字母(a-f)都必须是小写.十六进制字符串中不能包含多余的前导零.如果要转 ...