ABP 初探 之基於EasyUI的CURD


  結束了天天加班的項目,項目雖然結束,但還是有點小問題,只能在后期優化當中完成了,本次做項目采用了,MVC、Webapi、Entityframework,在園了里看到了有關ABP的介紹,同樣ABP也是最新技術集合,就加入了 ABP架構設計交流群 134710707,一起探討、學習與進步。

  ABP的技術文檔全是英文資料,不過現在不用擔心了,群里的熱心朋友已翻譯成能看的懂語言了,詳情 

  ABP 源代碼地址 https://github.com/aspnetboilerplate 

  ABP的基本介紹就不講了它是基於.net 4.5.1的,下載文檔后自己了解吧,現在只講解怎么用了

  公司的項目是基於Easyui的,因此Demo也是基於EasyUI的,ABP的返回值不能滿足Easyui的datagrid請求與顯示,對Abp源碼進行了部分修改,才能正常使用,具體修改會一一列出,給需要的朋友一點幫助。

  ABP的請求值返回的對象屬性首字母小寫,這是因為默認的Json格式是 CamelCasePropertyNamesContractResolver  ,只要把相關代碼修改為 

  對應的類名:AbpWebApiModule

private static void InitializeFormatters()
        {
            GlobalConfiguration.Configuration.Formatters.Clear();
            var formatter = new JsonMediaTypeFormatter();
            formatter.SerializerSettings.ContractResolver = new DefaultContractResolver();
            formatter.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
            GlobalConfiguration.Configuration.Formatters.Add(formatter);
            GlobalConfiguration.Configuration.Formatters.Add(new PlainTextFormatter());
        }

  Easyui的Datagrid請求是通過URL傳參數的,目前ABP不支持這種處理方法,因此只能自己在Controller里面寫方法了,不能調用自動生成的WebAPi,多了一個步驟,下面是構造的分頁類

public EasyUIPager GetPager(HttpRequestBase currentRequest)
        {
            EasyUIPager pager = new EasyUIPager();
            if (currentRequest.Form["page"] != null)
            {
                pager.CurrentPage = int.Parse(currentRequest.Form["page"]);
            }
            if (currentRequest.Form["rows"] != null)
            {
                pager.PageSize = int.Parse(currentRequest.Form["rows"]);
            }
            pager.SortCloumnName = currentRequest.Form["sort"];
            pager.SortOrder = currentRequest.Form["order"];
            pager.Filter = currentRequest.Form["filter"];
            return pager;
        }

 JS 請求調用代碼

function GridInit() {
        //VE.LoodToolbar(); //加載權限
        datagrid = $("#datagrid").datagrid({
            url: VE.AppPath + '/User/Get',
            title: '用戶信息',
            rownumbers: true,
            pagination: true,
            iconCls: VE.DatagridIconCls,
            height: VE.GridHeight,
            pageSize: VE.PageSize,
            pageList: VE.PageList,
            ctrlSelect:true,
            fitColumns: true,
            nowrap: false,
            border: true,
            idField: 'Id',
            sortName: 'Id',
            sortOrder: 'desc',
            columns: [[
                { field: 'ck', checkbox: true },
                { field: 'Id', title: 'Id', width: 80, sortable: true, hidden: true },
                { field: 'UserName', title: '用戶名', width: 100, sortable: true },
                { field: 'Surname', title: '姓', width: 60, sortable: true },
                { field: 'Name', title: '名', sortable: true },
                { field: 'EmailAddress', title: '郵箱', sortable: true },
                { field: 'CreationTime', title: '創建時間', width: 140, sortable: true },
                { field: 'CreatorUserName', title: '創建人', width: 100, sortable: true },
                { field: 'LastModifierUserName', title: '最后更新人', width: 100, sortable: true },
                { field: 'LastModificationTime', title: '最后更新時間', width: 140, sortable: true, formatter: VE.FormatterDateTime },
                { field: 'IsActive', title: '狀態', width: 45, sortable: true, formatter: VE.FormatterActive }
            ]],
            toolbar: [{
                iconCls: 'icon-add',
                text: '新增',
                handler: function () {
                    id = 0;
                    Save()
                }
            }, '-', {
                iconCls: 'icon-edit',
                text: '編輯',
                handler: function () {
                    id = VE.Edit("datagrid", VE.GridType_DataGrid)
                    if (id > 0) {
                        Save();
                    }
                }
            }, '-', {
                iconCls: 'icon-busy',
                text: '刪除',
                handler: function () {
                    Delete();
                }
            }, '-', {
                iconCls: 'icon-unlock',
                text: '啟用',
                handler: function () {
                    Active(true)
                }
            }, '-', {
                iconCls: 'icon-lock',
                text: '禁用',
                handler: function () {
                    Active(false)
                }
            }]
        });
    }
View Code

MVC Controller代碼

#region 獲取列表
        public JsonResult Get()
        {
            var provider = new EasyUIProvider();
            var pager = provider.GetPager(Request);
            var filter = new GetUserInput();
            if (!string.IsNullOrEmpty(pager.Filter))
            {
                filter = provider.DeserializeObject<GetUserInput>(pager.Filter);
            }
            filter.PageSize = pager.PageSize;
            filter.CurrentPage = pager.CurrentPage - 1;
            filter.SortOrder = pager.SortOrder;
            filter.SortCloumnName = pager.SortCloumnName;
            var grid = _userApplicationService.GetUser(filter);
            return Json(grid);
        }
        #endregion
View Code

效果圖如下

 

 關於創建人與最后更新人,ABP的處理比較好,只需要通過映射就可以了,不需要寫多余的子查詢,具體原理還沒查看源代碼,等了解后再詳解

關於批量操作,一般情況下每頁顯示20~50條數據,簡單的批量刪除基本可以滿足,如果需操作大量數據建議采用存儲過程,修改、添加不在介紹,具體實現請參考源代碼

 public async Task Delete(BatchDeleteRequestInput input)
        {
            for (int i = 0; i < input.Id.Split(',').Length; i++)
            {
                await _userRepository.DeleteAsync(Convert.ToInt64(input.Id.Split(',')[i]));
            }
            await _unitOfWorkManager.Current.SaveChangesAsync();
        }

對 UserFriendlyException 的處理進行了修改,根據不同的異常 彈出不同的提示框

public UserFriendlyException(string message, UserFriendlyExceptionCode code)
            : base(message)
        {

            if (code == UserFriendlyExceptionCode.Info)
            {
                Code = 1;
            }
            else if (code == UserFriendlyExceptionCode.Warn)
            {
                Code = 2;
            }
            else
            {
                Code = 0;
            }
        }
View Code

EasyUI對應代碼

$.ajax({
                url: VE.AppPath + url,
                type: 'post',
                contentType: 'application/json',
                data: JSON.stringify({ Id: VE.Ids.join(','), IsActive: active }),
                dataType: 'json',
                success: function (r) {
                    if (r.Success) {
                        VE.MessageShow("操作成功");
                        VE.GridJudge(gridId, isLoad, gridType);
                    } else {
                        if (r.Error.Code == 0) {
                            $.messager.alert('提示', r.Error.Message, "error");
                        }
                        else if (r.Error.Code == 1) {
                            $.messager.alert('提示', r.Error.Message, "info");
                        }
                        else if (r.Error.Code == 2) {
                            $.messager.alert('提示', r.Error.Message, "warn");
                        } else {
                            $.messager.alert('提示', r.Error.Message, "error");
                        }
                    }
                }
            });
View Code

項目結構如下

  大家都喜歡源代碼,F5直接運行,因此就寫了個demo供大家參考

  源碼下載 

 

設置 V.Market.Web 為啟動項目

修改 web.config 的連接字符串

<add name="Default" connectionString="data source=.;initial catalog=Market;persist security info=True;user id=sa;password=Password!;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

有的園友沒學習過EntityFramework,不知如何生成數據庫,下介紹數據庫的生成方法

通過命令生成數據庫 update-database (需運行兩次才能把數據寫到數據庫)

修改生成的數據 abpuser表  的 TenantId 修改成1 

由於上傳代碼時,忘記修改登錄的用戶名了,因此需修改 HomeController的 登錄用戶名為 Admin

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM