基於.net EF6 MVC5+WEB Api 的Web系統框架總結(2)-業務項目搭建
- 2019 年 10 月 3 日
- 筆記
本節將介紹如何進行業務項目搭建。
本業務項目示例是簡單的企業資訊管理功能,業務項目採用Code First方式,搭建包括:
- 創建實體項目
- 創建實體數據表映射
- 創建業務處理項目
- 創建業務Web項目
搭建完項目效果:
1、創建實體項目-ShiQuan.Company.Entity
創建企業資訊實體
示例中企業資訊包括:編號、名稱、負責人、聯繫人、聯繫電話、聯繫地址等
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ShiQuan.Company.Entity { /// <summary> /// 企業資訊 /// </summary> public class CompanyInfoEntity:BasicCompanyEntity { /// <summary> /// 編號 /// </summary> [Display(Name = "編號"), MaxLength(50)] public string Code { get; set; } /// <summary> /// 編號 /// </summary> [Display(Name = "編號"), MaxLength(100)] public string Name { get; set; } /// <summary> /// 負責人 /// </summary> [Display(Name = "負責人"), MaxLength(50)] public string Leader { get; set; } /// <summary> /// 聯繫人 /// </summary> [Display(Name = "聯繫人"), MaxLength(50)] public string Linkman { get; set; } /// <summary> /// 聯繫電話 /// </summary> [Display(Name = "聯繫電話"), MaxLength(50)] public string Phone { get; set; } /// <summary> /// 聯繫地址 /// </summary> [Display(Name = "聯繫地址"), MaxLength(255)] public string Address { get; set; } /// <summary> /// 備註說明 /// </summary> [Display(Name = "備註說明"), MaxLength(255)] public string Remark { get; set; } } }
2、創建實體數據表映射項目-ShiQuan.Company.Mapping
創建空資料庫
創建項目
創建企業資訊數據表映射
using ShiQuan.Company.Entity; using System; using System.Collections.Generic; using System.Data.Entity.ModelConfiguration; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ShiQuan.Company.Mapping { /// <summary> /// 實體數據映射 /// </summary> public class CompanyInfoMap : EntityTypeConfiguration<CompanyInfoEntity> { public CompanyInfoMap() { #region 表、主鍵 //表 this.ToTable("CompanyInfo"); //主鍵 this.HasKey(t => t.Id); #endregion #region 配置關係 #endregion } } }
創建實體資料庫上下文
選擇空Code First 模型
namespace ShiQuan.Company.Mapping { using System; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using System.Linq; public class CompanyDbContext : DbContext { //您的上下文已配置為從您的應用程式的配置文件(App.config 或 Web.config) //使用“CompanyDbContext”連接字元串。默認情況下,此連接字元串針對您的 LocalDb 實例上的 //“ShiQuan.Company.Mapping.CompanyDbContext”資料庫。 // //如果您想要針對其他資料庫和/或資料庫提供程式,請在應用程式配置文件中修改“CompanyDbContext” //連接字元串。 public CompanyDbContext() : base("name=CompanyDbContext") { } //為您要在模型中包含的每種實體類型都添加 DbSet。有關配置和使用 Code First 模型 //的詳細資訊,請參閱 http://go.microsoft.com/fwlink/?LinkId=390109。 // public virtual DbSet<MyEntity> MyEntities { get; set; } /// <summary> /// 重寫數據型號創建,添加企業資訊數據表映射 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Configurations.Add(new CompanyInfoMap()); base.OnModelCreating(modelBuilder); } } }
配置資料庫連接
<connectionStrings> <add name="CompanyDbContext" connectionString="Server=127.0.0.1;Initial Catalog=VSD_CompanyDB;User ID=sa;Password=123456*a" providerName="System.Data.SqlClient" /> </connectionStrings>
配置資料庫上下文允許進行更新升級
using System; using System.Collections.Generic; using System.Data.Entity.Migrations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ShiQuan.Company.Mapping.Migrations { internal sealed class Configuration : DbMigrationsConfiguration<CompanyDbContext> { public Configuration() { //配置允許資料庫更新升級 AutomaticMigrationsEnabled = true; AutomaticMigrationDataLossAllowed = true; } protected override void Seed(CompanyDbContext dbContext) { } } }
使用update-database 對資料庫進行升級更新
3、創建企業資訊管理業務處理項目-ShiQuan.Company.Business
創建企業資訊庫業務處理基礎類,實現實體查詢、刪除和保存功能。
using Learun.DataBase.Repository; using Learun.Util; using ShiQuan.Company.Entity; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace ShiQuan.Company.Business { /// <summary> /// 企業資訊管理庫業務處理基礎類 /// </summary> /// <typeparam name="T"></typeparam> public class BasicCompanyBLL<T> : RepositoryFactory<T> where T : class,new() { protected string dbConn = ""; /// <summary> /// 構造函數 /// </summary> public BasicCompanyBLL() { //this.dbConn = ConfigurationManager.ConnectionStrings["CompanyDbContext"].ConnectionString; this.dbConn = "CompanyDbContext"; } #region 獲取數據 /// <summary> /// 獲取列表 /// </summary> /// <param name="pagination">分頁</param> /// <param name="queryJson">查詢參數</param> /// <returns>返回分頁列表</returns> public virtual IEnumerable<T> GetPageList(Pagination pagination, string queryJson) { var expression = LinqExtensions.True<T>(); expression = QueryStringToExpression(expression, queryJson); return this.BaseRepository(dbConn).FindList(expression, pagination); } /// <summary> /// 獲取列表 /// </summary> /// <param name="pagination">分頁</param> /// <param name="queryJson">查詢參數</param> /// <returns>返回分頁列表</returns> public virtual IEnumerable<T> GetPageList(Pagination pagination, Expression<Func<T, bool>> linq) { return this.BaseRepository(dbConn).FindList(linq, pagination); } /// <summary> /// 獲取列表 /// </summary> /// <param name="queryJson">查詢參數</param> /// <returns>返回列表</returns> public virtual IEnumerable<T> GetList(string queryJson) { var expression = LinqExtensions.True<T>(); expression = QueryStringToExpression(expression, queryJson); return this.BaseRepository(dbConn).IQueryable(expression); } /// <summary> /// 獲取列表 /// </summary> /// <param name="queryJson">查詢參數</param> /// <returns>返回列表</returns> public virtual IQueryable<T> GetList(Expression<Func<T, bool>> linq) { return this.BaseRepository(dbConn).IQueryable(linq); } /// <summary> /// 獲取實體 /// </summary> /// <param name="keyValue">主鍵值</param> /// <returns></returns> public virtual T GetEntity(string keyValue) { return this.BaseRepository(dbConn).FindEntity(keyValue); } /// <summary> /// 根據條件獲取實體 /// </summary> /// <param name="linq">Linq條件</param> /// <returns></returns> public virtual T FindEntity(Expression<Func<T, bool>> linq) { return this.BaseRepository(dbConn).FindEntity(linq); } /// <summary> /// 獲取數據 /// </summary> /// <param name="queryJson"></param> /// <returns></returns> public virtual DataTable GetTable(string queryJson) { string sql = GetSQL(queryJson); return this.BaseRepository(dbConn).FindTable(sql); } /// <summary> /// 獲取數據 /// </summary> /// <param name="sql"></param> /// <returns></returns> public virtual DataTable GetTableBySql(string sql) { //string sql = GetSQL(queryJson); return this.BaseRepository(dbConn).FindTable(sql); } /// <summary> /// 獲取分頁列表,返回Datatable /// </summary> /// <param name="queryJson">查詢參數</param> /// <returns>返回列表</returns> public virtual DataTable GetPageTable(Pagination pagination, string queryJson) { string sql = GetSQL(queryJson); return this.BaseRepository(dbConn).FindTable(sql, pagination); } /// <summary> /// 獲取分頁列表,返回Datatable /// </summary> /// <param name="sql">查詢參數</param> /// <returns>返回列表</returns> public virtual DataTable GetPageTableBySql(Pagination pagination, string sql) { //string sql = GetSQL(queryJson); return this.BaseRepository(dbConn).FindTable(sql, pagination); } #endregion #region 提交數據 /// <summary> /// 刪除數據 /// </summary> /// <param name="keyValue">主鍵</param> public virtual void RemoveForm(string keyValue) { string[] dels = keyValue.Split(','); if (dels.Length > 1) { IRepository db = new RepositoryFactory().BaseRepository(dbConn).BeginTrans(); try { foreach (var item in dels) { db.Delete(item); } db.Commit(); } catch (Exception) { db.Rollback(); throw; } } else { this.BaseRepository(dbConn).Delete(keyValue); } } /// <summary> /// 保存表單(新增、修改) /// </summary> /// <param name="keyValue">主鍵值</param> /// <param name="entity">實體對象</param> /// <returns></returns> public virtual void SaveForm(string keyValue, T entity) { if (!string.IsNullOrEmpty(keyValue)) { this.BaseRepository(dbConn).Update(entity); } else { this.BaseRepository(dbConn).Insert(entity); } } #endregion #region 幫助函數 /// <summary> /// 生成查詢表達式 /// </summary> /// <param name="queryJson">查詢對象</param> /// <returns></returns> protected virtual Expression<Func<T, bool>> QueryStringToExpression(Expression<Func<T, bool>> expression, string queryJson) { if (string.IsNullOrEmpty(queryJson)) return expression; var queryParam = queryJson.ToJObject(); if (!queryParam["condition"].IsEmpty() && !queryParam["keyword"].IsEmpty()) { string condition = queryParam["condition"].ToString(); string keyword = queryParam["keyword"].ToString(); switch (condition) { default: break; } } return expression; } /// <summary> /// 根據實體生成SQL /// </summary> /// <param name="queryJson">查詢對象</param> /// <returns></returns> protected virtual string GetSQL(string queryJson) { StringBuilder sb = new StringBuilder(); var queryParam = queryJson.ToJObject(); if (!queryParam["condition"].IsEmpty() && !queryParam["keyword"].IsEmpty()) { string condition = queryParam["condition"].ToString(); string keyword = queryParam["keyword"].ToString(); sb.Append(" AND " + condition + " like '%" + keyword + "%'"); } return sb.ToString(); } #endregion } }
創建企業資訊業務處理類,繼承基礎業務處理類,重寫保存、過濾條件方法。
using ShiQuan.Company.Entity; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Linq.Expressions; using Learun.Util; using Learun.Util.Operat; namespace ShiQuan.Company.Business { /// <summary> /// 實現企業資訊管理業務處理,繼承企業資訊庫基礎業務處理 /// </summary> public class CompanyInfoBLL : BasicCompanyBLL<CompanyInfoEntity> { /// <summary> /// 數據保存 /// </summary> /// <param name="keyValue"></param> /// <param name="entity"></param> public override void SaveForm(string keyValue, CompanyInfoEntity entity) { try { if (string.IsNullOrEmpty(keyValue)) { entity.Id = Guid.NewGuid().ToString(); } else entity.Id = keyValue; base.SaveForm(keyValue, entity); } catch (Exception ex) { throw; } } /// <summary> /// 重寫查詢過濾條件 /// </summary> /// <param name="expression"></param> /// <param name="queryJson"></param> /// <returns></returns> protected override Expression<Func<CompanyInfoEntity, bool>> QueryStringToExpression(Expression<Func<CompanyInfoEntity, bool>> expression, string queryJson) { if (string.IsNullOrEmpty(queryJson)) return expression; var queryParam = queryJson.ToJObject(); if (queryParam["Code"].IsEmpty() == false) { string keyword = queryParam["Code"].ToString(); expression = expression.And(my => my.Code == keyword); } if (!queryParam["condition"].IsEmpty() && !queryParam["keyword"].IsEmpty()) { string condition = queryParam["condition"].ToString(); string keyword = queryParam["keyword"].ToString(); switch (condition) { default: break; } } return expression; } } }
4、創建企業資訊管理Web項目-ShiQuan.Company.Web
創建空的企業資訊管理控制器,實現列表、編輯視圖,數據查詢、刪除、保存方法。
using Learun.Application.Web; using Learun.Util; using ShiQuan.Company.Business; using ShiQuan.Company.Entity; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace ShiQuan.Company.Web.Areas.CompanyManage.Controllers { /// <summary> /// 企業資訊管理 /// </summary> public class CompanyInfoController : MvcControllerBase { // GET: CompanyManage/CompanyInfo CompanyInfoBLL service = new CompanyInfoBLL(); /// <summary> /// 列表視圖 /// </summary> /// <returns></returns> public ActionResult CompanyInfoIndex() { return View(); } /// <summary> /// 編輯視圖 /// </summary> /// <returns></returns> public ActionResult CompanyInfoForm() { return View(); } #region 獲取數據 /// <summary> /// 獲取列表 /// </summary> /// <param name="pagination">分頁參數</param> /// <param name="queryJson">查詢參數</param> /// <returns>返回分頁列表Json</returns> [HttpGet] public ActionResult GetPageListJson(string pagination, string queryJson) { Pagination paginationobj = pagination.ToObject<Pagination>(); var watch = CommonHelper.TimerStart(); var data = service.GetPageList(paginationobj, queryJson); var jsonData = new { rows = data, total = paginationobj.total, page = paginationobj.page, records = paginationobj.records, costtime = CommonHelper.TimerEnd(watch) }; //return ToJsonResult(jsonData); return Success(jsonData); } /// <summary> /// 獲取列表 /// </summary> /// <param name="queryJson">查詢參數</param> /// <returns>返回列表Json</returns> [HttpGet] public ActionResult GetListJson(string queryJson) { var data = service.GetList(queryJson); return ToJsonResult(data); } /// <summary> /// 獲取實體 /// </summary> /// <param name="keyValue">主鍵值</param> /// <returns>返回對象Json</returns> [HttpGet] public ActionResult GetFormJson(string keyValue) { var data = service.GetEntity(keyValue); return ToJsonResult(data); } #endregion #region 提交數據 /// <summary> /// 刪除數據 /// </summary> /// <param name="keyValue">主鍵值</param> /// <returns></returns> [HttpPost] [ValidateAntiForgeryToken] [AjaxOnly] public ActionResult RemoveForm(string keyValue) { service.RemoveForm(keyValue); return Success("刪除成功。"); } /// <summary> /// 保存表單(新增、修改) /// </summary> /// <param name="keyValue">主鍵值</param> /// <param name="entity">實體對象</param> /// <returns></returns> [HttpPost] [ValidateAntiForgeryToken] [AjaxOnly] public ActionResult SaveForm(string keyValue, CompanyInfoEntity entity) { service.SaveForm(keyValue, entity); return Success("操作成功。", entity); } #endregion } }
創建列表介面
@{ ViewBag.Title = "客戶管理"; Layout = "~/Views/Shared/_Index.cshtml"; } <div class="lr-layout"> <div class="lr-layout-center"> <div class="lr-layout-wrap lr-layout-wrap-notitle"> <div class="lr-layout-tool"> <div class="lr-layout-tool-left"> <div class="lr-layout-tool-item"> <input id="txt_Keyword" type="text" class="form-control" placeholder="請輸查詢關鍵字" /> </div> <div class="lr-layout-tool-item"> <a id="btn_Search" class="btn btn-primary btn-sm"><i class="fa fa-search"></i> <span class="lrlg">查詢</span></a> </div> </div> <div class="lr-layout-tool-right"> <div class="btn-group btn-group-sm"> <a id="btnReload" class="btn btn-default"><i class="fa fa-refresh"></i></a> </div> <div class="btn-group btn-group-sm" learun-authorize="yes"> <a id="btnAdd" class="btn btn-default"><i class="fa fa-plus"></i> <span class="lrlg">新增</span></a> <a id="btnEdit" class="btn btn-default"><i class="fa fa-pencil-square-o"></i> <span class="lrlg">編輯</span></a> <a id="btnDelete" class="btn btn-default"><i class="fa fa-trash-o"></i> <span class="lrlg">刪除</span></a> </div> </div> </div> <div class="lr-layout-body" id="gridtable"></div> </div> </div> </div> <script type="text/javascript"> var refreshGirdData; // 更新數據 var selectedRow; var bootstrap = function ($, learun) { "use strict"; var page = { init: function () { page.initGrid(); page.bind(); }, bind: function () { // 查詢 $('#btn_Search').on('click', function () { var keyword = $('#txt_Keyword').val(); page.search({ keyword: keyword }); }); // 刷新 $('#btnReload').on('click', function () { location.reload(); }); // 新增 $('#btnAdd').on('click', function () { selectedRow = null;//新增前請清空已選中行 learun.layerForm({ id: 'form', title: '新增客戶', url: top.$.rootUrl + '/CompanyManage/CompanyInfo/CompanyInfoForm', width: 600, height: 400, maxmin: true, callBack: function (id) { return top[id].acceptClick(refreshGirdData); } }); }); // 編輯 $('#btnEdit').on('click', function () { selectedRow = $('#gridtable').jfGridGet('rowdata'); var keyValue = $('#gridtable').jfGridValue('Id'); if (learun.checkrow(keyValue)) { learun.layerForm({ id: 'form', title: '編輯客戶', url: top.$.rootUrl + '/CompanyManage/CompanyInfo/CompanyInfoForm', width: 600, height: 400, maxmin: true, callBack: function (id) { return top[id].acceptClick(refreshGirdData); } }); } }); // 刪除 $('#btnDelete').on('click', function () { var keyValue = $('#gridtable').jfGridValue('Id'); if (learun.checkrow(keyValue)) { learun.layerConfirm('是否確認刪除該項!', function (res) { if (res) { learun.deleteForm(top.$.rootUrl + '/CompanyManage/CompanyInfo/DeleteForm', { keyValue: keyValue }, function () { refreshGirdData(); }); } }); } }); }, initGrid: function () { $('#gridtable').jfGrid({ url: top.$.rootUrl + '/CompanyManage/CompanyInfo/GetPageListJson', headData: [ { label: '編號', name: 'Code', width: 100, align: 'left' }, { label: '名稱', name: 'Name', width: 200, align: 'left' }, { label: '負責人', name: 'Leader', width: 100, align: 'left' }, { label: '聯繫人', name: 'Linkman', width: 100, align: 'left' }, { label: '聯繫電話', name: 'Phone', width: 100, align: 'left' }, { label: '聯繫地址', name: 'Address', width: 200, align: 'left' }, { label: "最後更新", name: "ModifyDate", width: 140, align: "left", formatter: function (cellvalue) { return learun.formatDate(cellvalue, 'yyyy-MM-dd hh:mm'); } }, { label: '備註', name: 'Remark', width: 200, align: 'left' }, ], mainId: 'Id', reloadSelected: true, isPage: true, sidx: 'Code' }); page.search(); }, search: function (param) { $('#gridtable').jfGridSet('reload', param); } }; // 保存數據後回調刷新 refreshGirdData = function () { page.search(); } page.init(); } </script>
創建編輯介面
@{ ViewBag.Title = "客戶添加"; Layout = "~/Views/Shared/_Form.cshtml"; } <div class="lr-form-wrap" id="form"> <div class="col-xs-12 lr-form-item"> <div class="lr-form-item-title">編號<font face="宋體">*</font></div> <input id="Code" type="text" class="form-control" isvalid="yes" checkexpession="NotNull" /> </div> <div class="col-xs-12 lr-form-item"> <div class="lr-form-item-title">名稱<font face="宋體">*</font></div> <input id="Name" type="text" class="form-control" isvalid="yes" checkexpession="NotNull" /> </div> <div class="col-xs-12 lr-form-item"> <div class="lr-form-item-title">負責人<font face="宋體">*</font></div> <input id="Leader" type="text" class="form-control" isvalid="yes" checkexpession="NotNull" /> </div> <div class="col-xs-12 lr-form-item"> <div class="lr-form-item-title">聯繫人</div> <input id="Linkman" type="text" class="form-control" isvalid="no" checkexpession="NotNull" /> </div> <div class="col-xs-12 lr-form-item"> <div class="lr-form-item-title">聯繫電話</div> <input id="Phone" type="text" class="form-control" /> </div> <div class="col-xs-12 lr-form-item"> <div class="lr-form-item-title">聯繫地址</div> <input id="Address" type="text" class="form-control" /> </div> <div class="col-xs-12 lr-form-item"> <div class="lr-form-item-title">備註</div> <textarea id="Remark" class="form-control" style="height: 50px;"></textarea> </div> </div> <script type="text/javascript"> var acceptClick; var keyValue = ''; var bootstrap = function ($, learun) { "use strict"; var selectedRow = learun.frameTab.currentIframe().selectedRow; var page = { init: function () { page.bind(); page.initData(); }, bind: function () { // 客戶級別 //$('#F_CustLevelId').lrDataItemSelect({ code: 'Client_Level', maxHeight: 230 }); //// 客戶類別 //$('#F_CustTypeId').lrDataItemSelect({ code: 'Client_Sort', maxHeight: 230 }); //// 客戶程度 //$('#F_CustDegreeId').lrDataItemSelect({ code: 'Client_Degree', maxHeight: 230 }); ////跟進人員 //$('#F_TraceUserId').lrformselect({ // layerUrl: top.$.rootUrl + '/LR_OrganizationModule/User/SelectForm', // layerUrlW: 800, // layerUrlH: 520, // dataUrl: top.$.rootUrl + '/LR_OrganizationModule/User/GetListByUserIds' //}); ////公司行業 //$('#F_CustIndustryId').lrDataItemSelect({ code: 'Client_Trade', maxHeight: 230 }); }, initData: function () { if (!!selectedRow) { keyValue = selectedRow.Id; $('#form').lrSetFormData(selectedRow); } } }; // 保存數據 acceptClick = function (callBack) { if (!$('#form').lrValidform()) { return false; } var postData = $('#form').lrGetFormData(keyValue); $.lrSaveForm(top.$.rootUrl + '/CompanyManage/CompanyInfo/SaveForm?keyValue=' + keyValue , postData , function (res) { // 保存成功後才回調 if (!!callBack) { callBack(); } }); }; page.init(); } </script>
業務項目,至此搭建完成,接下來,使用Web項目進行引用,
配置業務項目數據表映射
<!-- 實體類映射庫名稱 --> <add key="DataMapper" value="Learun.Application.Mapping.dll,ShiQuan.Company.Mapping.dll"/>
配置業務項目資料庫連接,添加配置功能菜單
運行系統效果
更多精彩,且聽下回分解!