EDP .Net开发框架--业务模型

news/2024/11/17 3:37:29/文章来源:https://www.cnblogs.com/alwaysinsist/p/18190582

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


业务模型概述

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

业务模型管理

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

业务模型分类

管理业务模型分类。
image

业务模型

  • 新增业务模型
    image
    image

  • 编辑业务模型
    image
    image
    image

  • 业务模型代码生成
    image
    image

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

业务模型开发

定义业务模型

创建业务模型类,继承基类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 ClassFullCodefrom t_school_student aleft join t_sys_organization_unit b on a.CampusId = b.IDleft join t_sys_organization_unit c on a.ClassId = c.IDleft 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}
}

image

[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 ClassFullCodefrom t_school_student aleft join t_sys_organization_unit b on a.CampusId = b.IDleft join t_sys_organization_unit c on a.ClassId = c.IDleft 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()。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708892.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS挂载硬盘

1.查看新添加的硬盘 fdisk -l2.挂载到/data目录 mount /dev/vdb1 /data 3.设置开机自启 vi /etc/fstab 在最后一行添加 /dev/vdb1 /data ext4 defaults 0 0

sed编辑器和awk

目录1.sed的执行过程(1)sed 的工作流程(2)打印内容(3)删除(4)替换(5)打印被修改的行(6)插入(7)复制粘贴2.awk(1)工作原理 1.sed的执行过程 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处…

“复兴杯”2023第四届大学生网络安全精英赛排位赛 Writeup

时间跟全国信安初赛重了(),不过也是第一次在CTF AK了( 个人信息 个人排名:15 解题过程 1观察代码,使用科学技术法进行绕过,2.023e3也就是2.023*10^3=2023,弱比较时会化为2023,但是运算时后并不绝对等于2024。 输入得到flag。2 打开网站可以看到电脑账号是ly,使用过滤…

基于webapi的websocket聊天室(四)

上一篇实现了多聊天室。这一片要继续改进的是实现收发文件,以及图片显示。 效果问题 websocket本身就是二进制传输。文件刚好也是二进制存储的。 文件本身的传输问题不太,但是需要传输文件元数据,比如文件名和扩展名之类的。这很必要,如果我们想知道怎么展示这个文件的话。比…

嵌入式Linux中的LED驱动控制(以野火STM32MP157开发板为例)

在嵌入式Linux系统中,由于从硬件到软件都是自己定制的,所以很多时候需要对自己定义的设备编写驱动程序。本例就以野火STM32MP157开发板为例,讨论如何控制开发板上三个LED的亮灭。 先来看一下LED部分的电路原理图,如下所示。从上图中可以看到,三个RGB颜色的二极管采用共阳接…

BUUctf xor

0x01 关于xor xor,即为计算机中的异或计算,相同为0,不同为1。 下面是关于异或加密的四个定理A ^ 0 = A A ^ A = 0 (A ^ B) ^ C = A ^ (B ^ C) (B ^ A) ^ A = B ^ 0 = B // 明文 B;密码 A观察可知,经历异或加密后的密文,再次进行异或算法即可得到明文。 0x02 题解 先丢进…

解决VSCode中Debug和运行路径不一致的

哈喽,大家好,我是木头左!背景介绍 在Visual Studio Code(简称VSCode)中进行开发时,经常需要使用到调试(Debug)功能。然而,有时候会发现,当尝试调试程序时,程序的运行路径与预期不符。这通常会导致程序无法正确读取文件或访问资源,从而影响调试过程。为了解决这个问…

DockerDesktop安装指南以及Windows下WSL2和 Hyper-V相关问题追查

文章原创不易,转载请注明来源 ,谢谢! 一、 问题 周末在家,给自己的老的台式机安装DockerDesktop。 电脑配置是处理器 Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz 3.30 GHz机带 RAM 16.0 GB (15.9 GB 可用)系统类型 64 位操作系统, 基于 x64 的处理器版本 Windows 10 专业版…

软件设计原则—接口隔离原则

B类需要方法1好处是b类继承A类后就有了方法1的功能,问题是B类被迫有了它不使用的方法2 这个其实是根据方法的职责细分接口,只需要依赖其中一个接口就可以了客户端不应该被迫依赖于它不使用的方法;一个类对另一个类的依赖应该建立在最小的接口上。 下面看一个例子来理解接口隔…

科翼阁:网赚广告套路千千万,美食沙雕占大半

在网赚的世界里,有70%是新手,20%是刚上手不久的,但这类人能坚持在网赚这个行业持续发展的机率只有10%,所以只有10%的能在网赚这个行业中进行持久战的,也有只这类人能真正在网赚中赚到大钱的人,网赚需要坚持,中途退出的人绝对无法在网赚这行中得到赢利。在国外,由于网赚…

关于 双向不循环列表的创建、插入、删除、遍历、检索、销毁

双向循环链表公式双向不循环链表代码 #include <stdio.h> #include <stdlib.h> #include <string.h>//宏定义一个数据域 #define DATA_LEN 60//双向不循环链表的节点定义 typedef struct double_link_list {//数据域char data[DATA_LEN]; // 数据…

软件设计原则—依赖倒转原则

高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。 简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。下面看一个例子来理解依赖倒转原则:组装电脑 现要组装一台电脑,需要配件cpu,硬盘,…