EDP .Net開發(fā)框架--業(yè)務(wù)模型
平臺(tái)下載地址:https://gitee.com/alwaysinsist/edp
業(yè)務(wù)模型概述
業(yè)務(wù)模型管理中所涉及的業(yè)務(wù)模型,業(yè)務(wù)模型的屬性,業(yè)務(wù)模型的視圖都是可以通過權(quán)限設(shè)置來實(shí)現(xiàn)數(shù)據(jù)的行(視圖),列(屬性)權(quán)限管控。業(yè)務(wù)模型是整個(gè)EDP平臺(tái)的核心基礎(chǔ),數(shù)據(jù)的查詢、新增、修改、刪除、行列權(quán)限都是通過業(yè)務(wù)模型來實(shí)現(xiàn)的。
業(yè)務(wù)模型管理
按分類管理系統(tǒng)內(nèi)各個(gè)業(yè)務(wù)模型,對(duì)應(yīng)系統(tǒng)中各個(gè)業(yè)務(wù)對(duì)象。
業(yè)務(wù)模型分類
管理業(yè)務(wù)模型分類。

業(yè)務(wù)模型
-
新增業(yè)務(wù)模型
![image]()
![image]()
-
編輯業(yè)務(wù)模型
![image]()
![image]()
![image]()
-
業(yè)務(wù)模型代碼生成
![image]()
![image]()
表設(shè)計(jì)文檔模板,可以包含多個(gè)表結(jié)構(gòu)設(shè)計(jì)
![image]()
業(yè)務(wù)模型開發(fā)
定義業(yè)務(wù)模型
創(chuàng)建業(yè)務(wù)模型類,繼承基類ModelPermissionBase。定義好的業(yè)務(wù)模型可以在上述的業(yè)務(wù)模型管理功能中進(jìn)行管理,實(shí)現(xiàn)數(shù)據(jù)行、列權(quán)限的管控。
點(diǎn)擊查看代碼
using System;
namespace School.Model
{
using EDP.Common.Model;
using EDP.Common.Help;
using EDP.Database;
using EDP.Framework;
using EDP.Authentication;
/// <summary>
/// 學(xué)生業(yè)務(wù)對(duì)象
/// </summary>
[ModelEnitity(TableName = "t_school_student", KeyName = "ID")]
public class StudentModel: ModelPermissionBase
{
/// <summary>
/// 構(gòu)造函數(shù)
/// </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 **----實(shí)體屬性---------------------------**
/// <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>
/// 編號(hào)
/// <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>
/// 聯(lián)系人
/// </summary>
[ModelEnitity(ColumnName = "Contact", MaxLength = 50)]
public string Contact { get; set; }
/// <summary>
/// 聯(lián)系人手機(jī)
/// </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>
/// 校區(qū)ID
/// </summary>
[ModelEnitity(ColumnName = "CampusId")]
public string CampusId { get; set; }
/// <summary>
/// 班級(jí)ID
/// </summary>
[ModelEnitity(ColumnName = "ClassId", IsRequired = true)]
public string ClassId { get; set; }
/// <summary>
/// 創(chuàng)建人ID
/// </summary>
[ModelEnitity(ColumnName = "CreateUserId")]
public string CreateUserId { get; set; }
/// <summary>
/// 創(chuàng)建人
/// </summary>
[ModelEnitity(ColumnName = "CreateUserName")]
public string CreateUserName { get; set; }
/// <summary>
/// 創(chuàng)建部門ID
/// </summary>
[ModelEnitity(ColumnName = "CreateDepartmentId")]
public string CreateDepartmentId { get; set; }
/// <summary>
/// 創(chuàng)建機(jī)構(gòu)ID
/// </summary>
[ModelEnitity(ColumnName = "CreateOrganizationId")]
public string CreateOrganizationId { get; set; }
/// <summary>
/// 創(chuàng)建時(shí)間
/// </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>
/// 修改時(shí)間
/// </summary>
[ModelEnitity(ColumnName = "ModifyTime")]
public DateTime? ModifyTime { get; set; }
/// <summary>
/// 備注
/// </summary>
[ModelEnitity(ColumnName = "Remarks", MaxLength = 1000)]
public string Remarks { get; set; }
#endregion
#region **----擴(kuò)展屬性---------------------------**
/// <summary>
/// 校區(qū)名稱
/// </summary>
public string CampusName { get; set; }
/// <summary>
/// 學(xué)校名稱
/// </summary>
public string SchoolName { get; set; }
/// <summary>
/// 班級(jí)名稱
/// </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>
/// 班級(jí)全編碼
/// </summary>
public string ClassFullCode { get; set; }
/// <summary>
/// 學(xué)校
/// </summary>
public Organization.OrganizationModel School { get; set; } = new Organization.OrganizationModel();
#endregion
#region **----方法-------------------------------**
/// <summary>
/// 創(chuàng)建當(dāng)前實(shí)體對(duì)象
/// </summary>
/// <param name="db">數(shù)據(jù)庫接口</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>
/// 修改當(dāng)前實(shí)體對(duì)象
/// </summary>
/// <param name="db">數(shù)據(jù)庫接口</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>
/// 修改當(dāng)前實(shí)體對(duì)象
/// </summary>
/// <param name="keyValue">主鍵值</param>
/// <param name="db">數(shù)據(jù)庫接口</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:主鍵對(duì)應(yīng)的屬性名
[ModelEnitity(ColumnName = "Name", IsRequired = true, MaxLength = 50)]
ColumnName:字段名稱
IsRequired:是否必須,用于驗(yàn)證屬性值是否必須有值
MaxLength:最大長(zhǎng)度,屬性值的最大長(zhǎng)度
[ModelEnitity(ColumnName = "ContactMobile", Regex = @"^[1]([3-9])[0-9]{9}$")]
Regex:正則表達(dá)式,用于驗(yàn)證屬性值格式
點(diǎn)擊查看代碼
/// <summary>
/// 構(gòu)造函數(shù)
/// </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:注冊(cè)表配置中數(shù)據(jù)庫連接配置所對(duì)應(yīng)的"Key"值
//若沒有設(shè)置連線字串,則取注冊(cè)表配置中的默認(rèn)數(shù)據(jù)庫連接
//this.SetConnectionString(Config.Database["default"]); 示例項(xiàng)目使用默認(rèn)數(shù)據(jù)庫連接,不需要設(shè)置
}
public string CampusName { get; set; }
擴(kuò)展屬性是默認(rèn)查詢SQL中所查詢的非業(yè)務(wù)模型映射的表中的字段。
點(diǎn)擊查看代碼
/// <summary>
/// 創(chuàng)建當(dāng)前實(shí)體對(duì)象
/// </summary>
/// <param name="db">數(shù)據(jù)庫接口</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>
/// 修改當(dāng)前實(shí)體對(duì)象
/// </summary>
/// <param name="db">數(shù)據(jù)庫接口</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>
/// 修改當(dāng)前實(shí)體對(duì)象
/// </summary>
/// <param name="keyValue">主鍵值</param>
/// <param name="db">數(shù)據(jù)庫接口</param>
public void Modify(string keyValue, IDBInstance db = null) {
this.ID = keyValue;
this.Modify(db);
}
定義查詢對(duì)象
查詢對(duì)象是用來實(shí)現(xiàn)業(yè)務(wù)對(duì)象的查詢,通過屬性來設(shè)置查詢條件。需要繼承QueryModelBase基類。
點(diǎn)擊查看代碼
using System;
namespace School.Model
{
using EDP.Common;
using EDP.Common.Model;
/// <summary>
/// 學(xué)生信息查詢對(duì)象
/// </summary>
[QueryModel] //標(biāo)記類的查詢對(duì)象特性
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>
/// 校區(qū)
/// </summary>
[QueryModel(Operator = QueryOperator.eq, ColumnName = "CampusId")]
public string CampusId { get; set; }
/// <summary>
/// 班級(jí)
/// </summary>
[QueryModel(Operator = QueryOperator.eq, ColumnName = "ClassId")]
public string ClassId { get; set; }
/// <summary>
/// 班級(jí)全編碼
/// </summary>
/// <example>ClassFullCode like '值%'</example>
[QueryModel(Operator = QueryOperator.likeRight, ColumnName = "ClassFullCode")]
public string ClassFullCode { get; set; }
/// <summary>
/// 編號(hào)姓名關(guān)鍵字
/// Number和Name都進(jìn)行l(wèi)ike查詢
/// </summary>
/// <example>Number like '%關(guān)鍵字%' or Name like '%值%'</example>
[QueryModel(Operator = QueryOperator.like, ColumnNameList = "Number;Name")]
public string NumberNameKeywrod { get; set; }
/// <summary>
/// 分頁對(duì)象
/// </summary>
public PageModel Page { get; set; } = new PageModel();
}
}
[QueryModel(Operator = QueryOperator.like, ColumnName = "Name")]
Operator:查詢操作符(=、>、<、>=、like等)
ColumnName:對(duì)應(yīng)業(yè)務(wù)對(duì)象的屬性(實(shí)體屬性,擴(kuò)展屬性),只要是默認(rèn)查詢SQL中包含的字段都可以作為查詢對(duì)象的屬性(查詢條件)
業(yè)務(wù)模型使用
-
業(yè)務(wù)模型屬性驗(yàn)證
var verify = item.Verify(keyValue);
此處通過Verify()方法驗(yàn)證業(yè)務(wù)模型各屬性值,通過屬性驗(yàn)證標(biāo)記(IsRequired,MaxLength, Regex)進(jìn)行驗(yàn)證。 -
業(yè)務(wù)模型新增
點(diǎn)擊查看代碼
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);
通過業(yè)務(wù)模型Create()方法創(chuàng)建當(dāng)前實(shí)體對(duì)象。
通過ValidateSQL屬性值確保不會(huì)有重復(fù)的Number值插入到數(shù)據(jù)庫。
調(diào)用InsertModel()方法新增業(yè)務(wù)模型數(shù)據(jù)。
- 業(yè)務(wù)模型修改
點(diǎn)擊查看代碼
item.Modify(keyValue, db);
item.Number = null; //編號(hào)不能修改
result = item.UpdateModel(db);
通過業(yè)務(wù)模型Modify()方法修改當(dāng)前實(shí)體對(duì)象。
調(diào)用UpdateModel()方法修改業(yè)務(wù)模型數(shù)據(jù)。
- 業(yè)務(wù)模型查詢
點(diǎn)擊查看代碼
ResultModel<StudentModel> ret = new ResultModel<StudentModel>();
ret.Content = new StudentModel();
ret.KeyValue = keyValue;
ret.Content.ID = keyValue;
ret.Content.Query(db);
使用統(tǒng)一的返回對(duì)象 ResultModel<StudentModel>。
實(shí)例化ret.Content并設(shè)置操作的主鍵值ret.KeyValue = keyValue。
設(shè)置查詢的主鍵值 ret.Content.ID = keyValue。
調(diào)用業(yè)務(wù)對(duì)象Query()方法 ret.Content.Query(db)。
執(zhí)行Query()查詢后,根據(jù)權(quán)限設(shè)置給ret.Content賦值。
ret.Content.AccessPropertyList中返回有權(quán)限的屬性名稱。
- 業(yè)務(wù)模型列表查詢
點(diǎn)擊查看代碼
ResultModel<List<StudentModel>> ret = new ResultModel<List<StudentModel>>();
ret.Content = new List<StudentModel>();
ret.Content.Query(queryModel.Page, queryModel, db);
ret.Page = queryModel.Page;
使用統(tǒng)一的返回對(duì)象 ResultModel<List<StudentModel>>。
實(shí)例化 ret.Content = new List<StudentModel>()。
調(diào)用業(yè)務(wù)對(duì)象Query()方法 ret.Content.Query(queryModel.Page, queryModel, db)。
queryModel為查詢對(duì)象StudentQueryModel的實(shí)例。
執(zhí)行Query()查詢后,根據(jù)權(quán)限設(shè)置給ret.Content賦值(有權(quán)限的數(shù)據(jù)集合)。
ret.Content[0].AccessPropertyList中返回有權(quán)限的屬性名稱。
- 業(yè)務(wù)模型刪除
點(diǎn)擊查看代碼
StudentModel item = new StudentModel();
item.Id = keyValue;
item.DeleteModel();
實(shí)例化StudentModel。
設(shè)置主鍵值 item.Id = keyValue。
調(diào)用業(yè)務(wù)對(duì)象DeleteModel()方法 item.DeleteModel()。









浙公網(wǎng)安備 33010602011771號(hào)