平台下载地址: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. Excel分析师的工资能一直飙升,原因其实是...

    世界上的数据分析师分为使用Excel的分析师和其他分析师两类. 即使在互联网数据分析界,java遍街头,Python不如狗,Excel也是不可替代的. 上班前以为自己是西装笔挺的Excel数据分析师, ...

  2. html-testRunner中文乱码

    如下图,使用 html-testRunner 这个库生成测试报告后,出现乱码 因为  HTML文件已经写了  文件编码是  utf-8 所以 我怀疑可能是 html-testRunner 这个库文件中 ...

  3. .Net 代码分析工具对比 visual studio 2022 current

    目录 原因 背景知识 名词解释 分析器 分析器在IDE里 目标 查找思路及过程 CodeMaid Roslyn StyleCop.Analyzer StyleCop? StyleCop.Analyze ...

  4. ASP.NET 部署常见问题及解决方案

    ASP.NET 部署部署过程中常见问题及解决方案 Could not load file or assembly 'XXXXX' or one of its dependencies. Access ...

  5. CentOS 6.4(64位)上安装错误libstdc++.so.6(GLIBCXX_3.4.14)解决办法

    CentOS 6.4(64位)上安装错误libstdc++.so.6(GLIBCXX_3.4.14)解决办法 (2013-07-29 13:18:01) 转载▼ 分类:linux系统 引用地址: ht ...

  6. nginx重新整理——————热部署和日志切割[三]

    前言 简单演示热部署和日志切割. 正文 什么是热部署了,我们前文也说过了一个编译后的nginx 二进制. 热部署就是无需停止现有的nginx,替换正在运行的nginx. 步骤: 复制nginx 二进制 ...

  7. Java集成系列:高效构建自定义插件

    前言 随着软件开发的快速发展和需求的不断增长,开发人员面临着更多的压力和挑战.传统的开发方法需要花费大量的时间和精力,而低代码开发平台的出现为开发人员提供了一种更加高效.快速的开发方式.今天小编就以构 ...

  8. 快速获取使用dblink的视图的全部字段

    快速获取使用dblink的视图的全部字段 默认情况下,使用dblink连接的视图在PL/SQL是没法通过代码助手获取全部的字段的 如果要获取全部字段的话,可以使用一个奇怪的方法 对要获取的使用dbli ...

  9. Schedulerx2.0支持应用级别资源管理和任务优先级

    1. 前言 Schedulerx2.0是一套分布式的任务调度+计算框架.作为一套分布式计算引擎,用户经常需要资源管理的需求,当前schedulerx仅仅支持单个任务实例的管控(比如单机子任务并发数.拉 ...

  10. Kubernetes 稳定性保障手册:洞察+预案

    简介: 稳定性保障是个复杂的话题,需要有效.可迭代.可持续保障集群的稳定性,系统性的方法或许可以解决该问题. 作者 | 悟鹏来源 | 阿里巴巴云原生公众号 <Kubernetes 稳定性保障手册 ...