翼度科技»论坛 编程开发 .net 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

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

业务模型概述

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

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

管理业务模型分类。

业务模型


  • 新增业务模型


  • 编辑业务模型



  • 业务模型代码生成


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

业务模型开发

定义业务模型

创建业务模型类,继承基类ModelPermissionBase。定义好的业务模型可以在上述的业务模型管理功能中进行管理,实现数据行、列权限的管控。
点击查看代码
  1. using System;
  2. namespace School.Model
  3. {   
  4.     using EDP.Common.Model;
  5.     using EDP.Common.Help;
  6.     using EDP.Database;
  7.     using EDP.Framework;
  8.     using EDP.Authentication;   
  9.     /// <summary>
  10.     /// 学生业务对象
  11.     /// </summary>
  12.     [ModelEnitity(TableName = "t_school_student", KeyName = "ID")]
  13.     public class StudentModel: ModelPermissionBase
  14.     {
  15.         /// <summary>
  16.         /// 构造函数
  17.         /// </summary>
  18.         public StudentModel() {
  19.             this.SetDefaultQuerySQL(@"select *
  20.         from (select a.ID
  21.                         ,a.Name
  22.                         ,a.Number
  23.                         ,a.GenderId
  24.                         ,a.Age
  25.                         ,a.Contact
  26.                         ,a.ContactMobile
  27.                         ,a.Hobby
  28.                         ,a.CampusId
  29.                         ,a.ClassId
  30.                         ,a.CreateUserId
  31.                         ,a.CreateUserName
  32.                         ,a.CreateDepartmentId
  33.                         ,a.CreateOrganizationId
  34.                         ,a.CreateTime
  35.                         ,a.ModifyUserId
  36.                         ,a.ModifyUserName
  37.                         ,a.ModifyTime
  38.                         ,a.Remarks
  39.                         ,b.Name CampusName
  40.                         ,c.Name ClassName
  41.                         ,d.Name SchoolName
  42.                         ,c.FullCode ClassFullCode
  43.                 from t_school_student a
  44.                 left join t_sys_organization_unit b on a.CampusId = b.ID
  45.                 left join t_sys_organization_unit c on a.ClassId = c.ID
  46.                 left join t_sys_organization_unit d on c.FullCode like d.FullCode + '%' and d.Levels = c.Levels - 3) tab");
  47.         }
  48.         #region **----实体属性---------------------------**
  49.         /// <summary>
  50.         /// 主键ID
  51.         /// </summary>
  52.         [ModelEnitity(ColumnName = "ID")]
  53.         public string ID { get; set; }
  54.         /// <summary>
  55.         /// 姓名
  56.         /// </summary>
  57.         [ModelEnitity(ColumnName = "Name", IsRequired = true, MaxLength = 50)]
  58.         public string Name { get; set; }
  59.         /// <summary>
  60.         /// 编号
  61.         /// <summary>
  62.         [ModelEnitity(ColumnName = "Number")]
  63.         public string Number { get; set; }
  64.         /// <summary>
  65.         /// 性别ID
  66.         /// </summary>
  67.         [ModelEnitity(ColumnName = "GenderId", IsRequired = true)]
  68.         public int? GenderId { get; set; }
  69.         /// <summary>
  70.         /// 年龄
  71.         /// </summary>
  72.         [ModelEnitity(ColumnName = "Age", IsRequired = true)]
  73.         public int? Age { get; set; }
  74.         /// <summary>
  75.         /// 联系人
  76.         /// </summary>
  77.         [ModelEnitity(ColumnName = "Contact", MaxLength = 50)]
  78.         public string Contact { get; set; }
  79.         /// <summary>
  80.         /// 联系人手机
  81.         /// </summary>
  82.         [ModelEnitity(ColumnName = "ContactMobile", Regex = @"^[1]([3-9])[0-9]{9}$")]
  83.         public string ContactMobile { get; set; }
  84.         /// <summary>
  85.         /// 兴趣爱好
  86.         /// </summary>
  87.         [ModelEnitity(ColumnName = "Hobby", MaxLength = 500)]
  88.         public string Hobby { get; set; }
  89.         /// <summary>
  90.         /// 校区ID
  91.         /// </summary>
  92.         [ModelEnitity(ColumnName = "CampusId")]
  93.         public string CampusId { get; set; }
  94.         /// <summary>
  95.         /// 班级ID
  96.         /// </summary>
  97.         [ModelEnitity(ColumnName = "ClassId", IsRequired = true)]
  98.         public string ClassId { get; set; }
  99.         /// <summary>
  100.         /// 创建人ID
  101.         /// </summary>
  102.         [ModelEnitity(ColumnName = "CreateUserId")]
  103.         public string CreateUserId { get; set; }
  104.         /// <summary>
  105.         /// 创建人
  106.         /// </summary>
  107.         [ModelEnitity(ColumnName = "CreateUserName")]
  108.         public string CreateUserName { get; set; }
  109.         /// <summary>
  110.         /// 创建部门ID
  111.         /// </summary>
  112.         [ModelEnitity(ColumnName = "CreateDepartmentId")]
  113.         public string CreateDepartmentId { get; set; }
  114.         /// <summary>
  115.         /// 创建机构ID
  116.         /// </summary>
  117.         [ModelEnitity(ColumnName = "CreateOrganizationId")]
  118.         public string CreateOrganizationId { get; set; }
  119.         /// <summary>
  120.         /// 创建时间
  121.         /// </summary>
  122.         [ModelEnitity(ColumnName = "CreateTime")]
  123.         public DateTime? CreateTime { get; set; }
  124.         /// <summary>
  125.         /// 修改人ID
  126.         /// </summary>
  127.         [ModelEnitity(ColumnName = "ModifyUserId")]
  128.         public string ModifyUserId { get; set; }
  129.         /// <summary>
  130.         /// 修改人
  131.         /// </summary>
  132.         [ModelEnitity(ColumnName = "ModifyUserName")]
  133.         public string ModifyUserName { get; set; }
  134.         /// <summary>
  135.         /// 修改时间
  136.         /// </summary>
  137.         [ModelEnitity(ColumnName = "ModifyTime")]
  138.         public DateTime? ModifyTime { get; set; }
  139.         /// <summary>
  140.         /// 备注
  141.         /// </summary>
  142.         [ModelEnitity(ColumnName = "Remarks", MaxLength = 1000)]
  143.         public string Remarks { get; set; }
  144.         #endregion
  145.         #region **----扩展属性---------------------------**
  146.         /// <summary>
  147.         /// 校区名称
  148.         /// </summary>
  149.         public string CampusName { get; set; }
  150.         /// <summary>
  151.         /// 学校名称
  152.         /// </summary>
  153.         public string SchoolName { get; set; }
  154.         /// <summary>
  155.         /// 班级名称
  156.         /// </summary>
  157.         public string ClassName { get; set; }
  158.         /// <summary>
  159.         /// 性别@readonly
  160.         /// </summary>
  161.         public GenderEnum Gender {
  162.             get {
  163.                 GenderEnum ret = GenderEnum.None;
  164.                 if (this.GenderId.HasValue) {
  165.                     try { ret = (GenderEnum)this.GenderId; }
  166.                     catch { }
  167.                 }
  168.                 return ret;
  169.             }
  170.         }
  171.         /// <summary>
  172.         /// 性别显示@readonly
  173.         /// </summary>
  174.         public string GenderDisplay {
  175.             get {
  176.                 return EnumHelp.GetEnumDescription(this.Gender);
  177.             }
  178.         }
  179.         /// <summary>
  180.         /// 班级全编码
  181.         /// </summary>
  182.         public string ClassFullCode { get; set; }
  183.         /// <summary>
  184.         /// 学校
  185.         /// </summary>
  186.         public Organization.OrganizationModel School { get; set; } = new Organization.OrganizationModel();
  187.         #endregion
  188.         #region **----方法-------------------------------**
  189.         /// <summary>
  190.         /// 创建当前实体对象
  191.         /// </summary>
  192.         /// <param name="db">数据库接口</param>
  193.         public void Create(IDBInstance db = null) {
  194.             if (string.IsNullOrWhiteSpace(this.ID))
  195.                 this.ID = Guid.NewGuid().ToString();
  196.             var loginUser = AuthenticationHelp.GetLoginUser(db);
  197.             if (loginUser != null && loginUser.IsLogin) {
  198.                 this.CreateUserId = loginUser.UserInfo.ID;
  199.                 this.CreateUserName = loginUser.UserInfo.Name;
  200.                 this.CreateDepartmentId = loginUser.UserInfo.DepartmentId;
  201.                 this.CreateOrganizationId = loginUser.UserInfo.OrganizationId;
  202.             }
  203.             this.CreateTime = DateTime.Now;
  204.             this.ModifyTime = null;
  205.             this.ModifyUserId = null;
  206.             this.ModifyUserName = null;
  207.         }
  208.         /// <summary>
  209.         /// 修改当前实体对象
  210.         /// </summary>
  211.         /// <param name="db">数据库接口</param>
  212.         public void Modify(IDBInstance db = null) {
  213.             this.ModifyTime = DateTime.Now;
  214.             var loginUser = AuthenticationHelp.GetLoginUser(db);
  215.             if (loginUser != null && loginUser.IsLogin) {
  216.                 this.ModifyUserId = loginUser.UserInfo.ID;
  217.                 this.ModifyUserName = loginUser.UserInfo.Name;
  218.             }
  219.             this.ModifyTime = DateTime.Now;
  220.             this.CreateDepartmentId = null;
  221.             this.CreateOrganizationId = null;
  222.             this.CreateTime = null;
  223.             this.CreateUserId = null;
  224.             this.CreateUserName = null;
  225.         }
  226.         /// <summary>
  227.         /// 修改当前实体对象
  228.         /// </summary>
  229.         /// <param name="keyValue">主键值</param>
  230.         /// <param name="db">数据库接口</param>
  231.         public void Modify(string keyValue, IDBInstance db = null) {
  232.             this.ID = keyValue;
  233.             this.Modify(db);
  234.         }
  235.         #endregion
  236.     }
  237. }
复制代码

[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:正则表达式,用于验证属性值格式
点击查看代码
  1. /// <summary>
  2. /// 构造函数
  3. /// </summary>
  4. public StudentModel() {
  5.             this.SetDefaultQuerySQL(@"select *
  6.         from (select a.ID
  7.                         ,a.Name
  8.                         ,a.Number
  9.                         ,a.GenderId
  10.                         ,a.Age
  11.                         ,a.Contact
  12.                         ,a.ContactMobile
  13.                         ,a.Hobby
  14.                         ,a.CampusId
  15.                         ,a.ClassId
  16.                         ,a.CreateUserId
  17.                         ,a.CreateUserName
  18.                         ,a.CreateDepartmentId
  19.                         ,a.CreateOrganizationId
  20.                         ,a.CreateTime
  21.                         ,a.ModifyUserId
  22.                         ,a.ModifyUserName
  23.                         ,a.ModifyTime
  24.                         ,a.Remarks
  25.                         ,b.Name CampusName
  26.                         ,c.Name ClassName
  27.                         ,d.Name SchoolName
  28.                         ,c.FullCode ClassFullCode
  29.                 from t_school_student a
  30.                 left join t_sys_organization_unit b on a.CampusId = b.ID
  31.                 left join t_sys_organization_unit c on a.ClassId = c.ID
  32.                 left join t_sys_organization_unit d on c.FullCode like d.FullCode + '%' and d.Levels = c.Levels - 3) tab");
  33.             //引入命名空间 using EDP.Common;
  34.             //default:注册表配置中数据库连接配置所对应的"Key"值
  35.             //若没有设置连线字串,则取注册表配置中的默认数据库连接
  36.             //this.SetConnectionString(Config.Database["default"]); 示例项目使用默认数据库连接,不需要设置
  37.         }
复制代码
在构造函数中通过SetDefaultQuerySQL()方法设置默认查询SQL,通过SetConnectionString()方法设置数据库连接字符串(若没设置则取默认数据库连接字串)。public string CampusName { get; set; }
扩展属性是默认查询SQL中所查询的非业务模型映射的表中的字段。
点击查看代码
  1. /// <summary>
  2. /// 创建当前实体对象
  3. /// </summary>
  4. /// <param name="db">数据库接口</param>
  5. public void Create(IDBInstance db = null) {
  6.     if (string.IsNullOrWhiteSpace(this.ID))
  7.         this.ID = Guid.NewGuid().ToString();
  8.     var loginUser = AuthenticationHelp.GetLoginUser(db);
  9.     if (loginUser != null && loginUser.IsLogin) {
  10.         this.CreateUserId = loginUser.UserInfo.ID;
  11.         this.CreateUserName = loginUser.UserInfo.Name;
  12.         this.CreateDepartmentId = loginUser.UserInfo.DepartmentId;
  13.         this.CreateOrganizationId = loginUser.UserInfo.OrganizationId;
  14.     }
  15.     this.CreateTime = DateTime.Now;
  16.     this.ModifyTime = null;
  17.     this.ModifyUserId = null;
  18.     this.ModifyUserName = null;
  19. }
  20. /// <summary>
  21. /// 修改当前实体对象
  22. /// </summary>
  23. /// <param name="db">数据库接口</param>
  24. public void Modify(IDBInstance db = null) {
  25.     this.ModifyTime = DateTime.Now;
  26.     var loginUser = AuthenticationHelp.GetLoginUser(db);
  27.     if (loginUser != null && loginUser.IsLogin) {
  28.         this.ModifyUserId = loginUser.UserInfo.ID;
  29.         this.ModifyUserName = loginUser.UserInfo.Name;
  30.     }
  31.     this.ModifyTime = DateTime.Now;
  32.     this.CreateDepartmentId = null;
  33.     this.CreateOrganizationId = null;
  34.     this.CreateTime = null;
  35.     this.CreateUserId = null;
  36.     this.CreateUserName = null;
  37. }
  38. /// <summary>
  39. /// 修改当前实体对象
  40. /// </summary>
  41. /// <param name="keyValue">主键值</param>
  42. /// <param name="db">数据库接口</param>
  43. public void Modify(string keyValue, IDBInstance db = null) {
  44.     this.ID = keyValue;
  45.     this.Modify(db);
  46. }
复制代码
在业务对象上提供Create()和Modify()扩展方法,用于在创建和修改业务时调用,给业务对象必要属性赋值。定义查询对象

查询对象是用来实现业务对象的查询,通过属性来设置查询条件。需要继承QueryModelBase基类。
点击查看代码
  1. using System;
  2. namespace School.Model
  3. {
  4.     using EDP.Common;
  5.     using EDP.Common.Model;
  6.     /// <summary>
  7.     /// 学生信息查询对象
  8.     /// </summary>
  9.     [QueryModel] //标记类的查询对象特性
  10.     public class StudentQueryModel : QueryModelBase //继承QueryModelBase
  11.     {
  12.         /// <summary>
  13.         /// 姓名
  14.         /// </summary>
  15.         [QueryModel(Operator = QueryOperator.like, ColumnName = "Name")]
  16.         public string Name { get; set; }
  17.         /// <summary>
  18.         /// 性别
  19.         /// </summary>
  20.         [QueryModel(Operator = QueryOperator.eq, ColumnName = "GenderId")]
  21.         public int? GenderId { get; set; }
  22.         /// <summary>
  23.         /// 校区
  24.         /// </summary>
  25.         [QueryModel(Operator = QueryOperator.eq, ColumnName = "CampusId")]
  26.         public string CampusId { get; set; }
  27.         /// <summary>
  28.         /// 班级
  29.         /// </summary>
  30.         [QueryModel(Operator = QueryOperator.eq, ColumnName = "ClassId")]
  31.         public string ClassId { get; set; }
  32.         /// <summary>
  33.         /// 班级全编码
  34.         /// </summary>
  35.         /// <example>ClassFullCode like '值%'</example>
  36.         [QueryModel(Operator = QueryOperator.likeRight, ColumnName = "ClassFullCode")]
  37.         public string ClassFullCode { get; set; }
  38.         /// <summary>
  39.         /// 编号姓名关键字
  40.         /// Number和Name都进行like查询
  41.         /// </summary>
  42.         /// <example>Number like '%关键字%' or Name like '%值%'</example>
  43.         [QueryModel(Operator = QueryOperator.like, ColumnNameList = "Number;Name")]
  44.         public string NumberNameKeywrod { get; set; }
  45.         /// <summary>
  46.         /// 分页对象
  47.         /// </summary>
  48.         public PageModel Page { get; set; } = new PageModel();
  49.     }
  50. }
复制代码
[QueryModel(Operator = QueryOperator.like, ColumnName = "Name")]
Operator:查询操作符(=、>、=、like等)
ColumnName:对应业务对象的属性(实体属性,扩展属性),只要是默认查询SQL中包含的字段都可以作为查询对象的属性(查询条件)
业务模型使用

详见示例项目StudentBLL.cs

  • 业务模型属性验证
    var verify = item.Verify(keyValue);
    此处通过Verify()方法验证业务模型各属性值,通过属性验证标记(IsRequired,MaxLength, Regex)进行验证。
  • 业务模型新增
点击查看代码
  1. item.Create(db);
  2. item.ValidateSQL = string.Format("where not exists (select 1 from t_school_student where Number = '{0}')", item.Number);
  3. result = item.InsertModel(db);
复制代码
  1. 通过业务模型Create()方法创建当前实体对象。
  2. 通过ValidateSQL属性值确保不会有重复的Number值插入到数据库。
  3. 调用InsertModel()方法新增业务模型数据。
复制代码

  • 修改业务模型
点击查看代码
  1. item.Modify(keyValue, db);
  2. item.Number = null; //编号不能修改
  3. result = item.UpdateModel(db);
复制代码
  1. 通过业务模型Modify()方法修改当前实体对象。
  2. 调用UpdateModel()方法修改业务模型数据。
复制代码

  • 业务模型查询
点击查看代码
  1. ResultModel<StudentModel> ret = new ResultModel<StudentModel>();
  2. ret.Content = new StudentModel();
  3. ret.KeyValue = keyValue;
  4. ret.Content.ID = keyValue;
  5. ret.Content.Query(db);
复制代码
  1. 使用统一的返回对象 ResultModel<StudentModel>。
  2. 实例化ret.Content并设置操作的主键值ret.KeyValue = keyValue。
  3. 设置查询的主键值 ret.Content.ID = keyValue。
  4. 调用业务对象Query()方法 ret.Content.Query(db)。
  5. 执行Query()查询后,根据权限设置给ret.Content赋值。
  6. ret.Content.AccessPropertyList中返回有权限的属性名称。
复制代码

  • 业务模型列表查询
点击查看代码
  1. ResultModel<List<StudentModel>> ret = new ResultModel<List<StudentModel>>();
  2. ret.Content = new List<StudentModel>();
  3. ret.Content.Query(queryModel.Page, queryModel, db);
  4. ret.Page = queryModel.Page;
复制代码
  1. 使用统一的返回对象 ResultModel<List<StudentModel>>。
  2. 实例化 ret.Content = new List<StudentModel>()。
  3. 调用业务对象Query()方法 ret.Content.Query(queryModel.Page, queryModel, db)。
  4. queryModel为查询对象StudentQueryModel的实例。
  5. 执行Query()查询后,根据权限设置给ret.Content赋值(有权限的数据集合)。
  6. ret.Content[0].AccessPropertyList中返回有权限的属性名称。
复制代码

  • 业务模型删除
点击查看代码
  1. StudentModel item = new StudentModel();
  2. item.Id = keyValue;
  3. item.DeleteModel();
复制代码
  1. 实例化StudentModel。
  2. 设置主键值 item.Id = keyValue。
  3. 调用业务对象DeleteModel()方法 item.DeleteModel()。
复制代码
来源:https://www.cnblogs.com/alwaysinsist/p/18190582
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具