基於.net EF6 MVC5+WEB Api 的Web系統框架總結(2)-業務項目搭建

  • 2019 年 10 月 3 日
  • 筆記

本節將介紹如何進行業務項目搭建。

本業務項目示例是簡單的企業資訊管理功能,業務項目採用Code First方式,搭建包括:

  1. 創建實體項目
  2. 創建實體數據表映射
  3. 創建業務處理項目
  4. 創建業務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>&nbsp;<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>&nbsp;<span class="lrlg">新增</span></a>                          <a id="btnEdit" class="btn btn-default"><i class="fa fa-pencil-square-o"></i>&nbsp;<span class="lrlg">編輯</span></a>                          <a id="btnDelete" class="btn btn-default"><i class="fa fa-trash-o"></i>&nbsp;<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"/>

配置業務項目資料庫連接,添加配置功能菜單

運行系統效果

更多精彩,且聽下回分解!