ABP框架實戰 1.基礎信息維護


在之前的一個開發項目中,因為公司戰略發展,引用了這個ABP開源框架作為新項目的基礎版本,由於客戶的要求需要遷移舊系統數據,以及其他的一些原因,數據庫采用了Oracle數據庫管理。所以引用了Dapper這個ORM框架作為數據訪問的擴展,在前期的開發過程中,碰到過很多的坑,但是通過學習陽光銘睿tkb至簡這兩位博主寫的一系列文章,以及其他同事的幫助下,慢慢的熟悉了ABP框架的一些原理以及思路。

下面簡單介紹一下這個Abp框架以及一些學習的資料:

ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。

ASP.NET Boilerplate是一個用最佳實踐和流行技術開發現代WEB應用程序的新起點,它旨在成為一個通用的WEB應用程序框架和項目模板。

ASP.NET Boilerplate 基於DDD的經典分層架構思想,實現了眾多DDD的概念(但沒有實現所有DDD的概念)。

ABP的官方網站http://www.aspnetboilerplate.com

ABP在Github上的開源項目https://github.com/aspnetboilerplate

陽光銘睿:http://www.cnblogs.com/mienreal/p/4528470.html

tkb至簡:http://www.cnblogs.com/farb/p/ABPTheory.html

1.在歷經了7個月(1607-1701)的時間,項目前兩期的開發工作也算是全部的完成了,幸運的我一直留到了最后,負責后續功能以及App對接的開發,以及試運行問題過程中客戶提出問題的維護。

2.在后面的某個日期中,全體這個項目的參與人員進行了一次會議總結,總體來說還算不錯吧。

3.在后來的某一天,自己想要在最基礎的框架上面弄一個基礎的框架管理,關於簡單的用戶-部門-角色-權限管理這一塊,可能還有很多地方沒有弄完善的地方,目前還存在一部分的,但是簡單來說也能滿足一些簡單的管理需求吧。(因為在這個項目開發過程中,這一塊的數據管理是用的之前公司成熟的一套PMI框架,引用的單點登錄,所以只能夠參照他的思路來弄)

項目總體框架:

這里鏈接一個同事寫的一篇文章吧,上面有關於這個項目框架的一些詳細介紹http://www.cnblogs.com/yuanbeier/articles/6394484.html

下面講一下自己弄這個的開發過程吧。

a.建立PDM,數據對應關系

b.生成數據庫,以及實體,其實這里在ABP最初始的做法是采用Code First模式先建立實體在生成數據結構,個人覺得看自己習慣吧。

c.創立對應的Application Services, Controller,View,Js

d.然后就是具體的編碼業務完成了,這個前段采用最快速的easyui開發,在這里參考了之前一個同事寫的一個基類,然后在其思路上重新了寫了一個基類,在這里的思路也正是考慮到ABP的約定大於規范的開發思路

  1 var TopeveryBase = Base.extend({
  2     /*構造方法*/
  3     constructor: function () {
  4     },
  5     /*初始化表格*/
  6     initGrid: function (options) {
  7         options = $.extend({}, { id: "grid", width: "100%", height: "600", method: "post", singleSelect: true }, options || {});
  8         if (options.url == null) {
  9             options.url = $("#" + options.id).attr("url");
 10         }
 11         if (typeof (options.url) == "undefined") {
 12             options.url = $("#" + options.id).attr("turl");
 13         }
 14         if ($("#" + options.id).attr("singleSelect") === "false") {
 15             options.singleSelect = true;
 16         }
 17         var gridParm = {
 18             idField: "id",
 19             fitColumns: true,
 20             loadMsg: false,
 21             nowrap: false,
 22             queryParams: options.queryParams,
 23             method: options.method,
 24             singleSelect: options.singleSelect,
 25             iconCls: "icon-save",
 26             striped: true,
 27             height: options.height,
 28             animate: true,
 29             collapsible: true,
 30             border: true,
 31             rownumbers: true, //行號
 32             pagination: options.pagination || true, //分頁控件
 33             pageSize: 10,
 34             pageList: [1, 10, 20, 50, 100, 250, 500, 1000],
 35             sortName: "Id",
 36             sortOrder: "desc",
 37             toolbar: '#toolbarWrap',
 38             onLoadSuccess: function (data) {
 39                 $(this).datagrid('doCellTip', { 'max-width': '400px', 'delay': 500 });
 40                 $(this).datagrid("clearSelections").datagrid("clearChecked");
 41             },
 42             loader: function (param, success, error) {
 43                 if (typeof (param.sort) == "undefined") {
 44                     param.sort = "Id";
 45                 }
 46                 if (typeof (param.order) == "undefined") {
 47                     param.order = "desc";
 48                 }
 49                 var postParm = {
 50                     PageIndex: param.page,
 51                     PageCount: param.rows,
 52                     sort: param.sort,
 53                     order: param.order
 54                 };
 55                 if (options.queryParams != null) {
 56                     postParm = $.extend({}, postParm, options.queryParams);
 57                 }
 58                 postParm = $.extend({}, postParm);
 59                 var formpostdata = topevery.form2Json("selectFrom");
 60                 postParm = $.extend({}, postParm, formpostdata);
 61                 /* 獲取詳情*/
 62                 easyuiBase.ajax({
 63                     type: "post",
 64                     url: options.url,
 65                     data: JSON.stringify(postParm),
 66                     loading: false
 67                 }, function (data) {
 68                     if (data.Success) {
 69                         var array = new Object();
 70                         array.rows = data.Result.Rows;
 71                         array.total = data.Result.Total;
 72                         success(array);
 73                     } else {
 74                         error();
 75                     }
 76                 }, true);
 77             }
 78         };
 79         for (var i = 0; i < $(".easyui-textbox").length; i++) {
 80             $("#" + $('.easyui-textbox').eq(i)[0].id + "").textbox({
 81                 inputEvents: $.extend({}, $.fn.textbox.defaults.inputEvents, {
 82                     keyup: function (event) {
 83                         if (event.keyCode === 13) {
 84                             User.loadInfo();
 85                         }
 86                     }
 87                 })
 88             });
 89         };
 90         if (options.columns != null) {
 91             gridParm.columns = options.columns;
 92         }
 93         $("#" + options.id).datagrid(gridParm);
 94     },
 95     /**
 96      * 
 97      * @param {} id 修改時所用查詢編號
 98      * @param {} 加載修改查看 callback 回調函數
 99      * @param {} 新增修改之后 callback1 回調函數
100      * @param {} options 參數集合
101      * @returns {} 
102      */
103     View: function (id, callback, callback1, options) {
104         if (id > 0) {
105             options = $.extend({}, { id: "edit", btn: "save", sumbit: "sumbitForm", grid: "grid" }, options || {});
106         } else {
107             options = $.extend({}, { id: "add", btn: "save", sumbit: "sumbitForm", grid: "grid" }, options || {});
108         }
109         var urlstring = $("#" + options.id).attr("url").split(',');
110         //geturl  獲取修改需要加載信息
111         if (options.geturl == null) {
112             if (urlstring.length > 0) {
113                 options.geturl = urlstring[1];
114             }
115         }
116         ///新增or修改url
117         if (options.url == null) {
118             options.url = urlstring[0];
119         }
120         $("#" + options.sumbit).form("reset");
121         if (id !== "undefined" && id != null) {
122             //修改時  數據加載到頁面
123             easyuiBase.ajax({
124                 type: "POST",
125                 url: options.geturl,
126                 data: JSON.stringify({ Id: id }),
127                 loading: false
128             }, function (data) {
129                 if (data.Success) {
130                     var row = data.Result;
131                     $("#" + options.sumbit).form("load", row);
132                     callback(row);
133                 } else {
134                     error();
135                 }
136             });
137         }
138         //彈出層dialog Id
139         if (options.name == null) {
140             options.name = $("#" + options.id).attr("name");
141         }
142         $("#" + options.name).dialog('open');
143         $("#" + options.btn).click(function () {
144             if ($("#" + options.sumbit).form('validate') === false) {
145                 return;
146             }
147             easyuiBase.ajax({
148                 type: "post",
149                 url: options.url,
150                 data: JSON.stringify(easyuiBase.form2Json(options.sumbit)),
151                 loading: false
152             }, function (data) {
153                 if (data.Success) {
154                     if (data.Result.IsSuccess) {
155                         $("#" + options.name).dialog('close');
156                         try {
157                             topeveryMessage.show(data.Result.Message);
158                         } catch (e) {
159                         }
160                         $("#" + options.sumbit).form("reset");
161                         $("#" + options.grid).datagrid("load");
162                         $("#" + options.btn).unbind();
163                         if (callback1 !== "undefined" && callback1 != null) {
164                             callback1(data.Result);
165                         }
166                     } else {
167                         try {
168                             topeveryMessage.show(data.Result.Message);
169                         } catch (e) {
170 
171                         }
172                     }
173                 } else {
174                     error();
175                 }
176             });
177         });
178     },
179     //刪除
180     delData: function (options, callback) {
181         options = $.extend({}, { id: "delete", grid: "grid" }, options || {});
182         var urlstring = $("#" + options.id).attr("url");
183         ///刪除url
184         if (options.url == null) {
185             options.url = urlstring;
186         }
187         var arrRows = $('#' + options.grid).datagrid('getSelections');
188         if (arrRows.length === 0) {
189             $.messager.alert('提示', '請選擇一條需要刪除的記錄!', 'info');
190         } else {
191             var ids = [];
192             $.each(arrRows, function () {
193                 ids.push(this.Id);
194             });
195             easyuiBase.ajax({
196                 type: "post",
197                 url: options.url,
198                 data: JSON.stringify({ "Ids": ids.join() }),
199                 contentType: "application/json",
200                 loading: false
201             }, function (data) {
202                 if (data.Success) {
203                     if (data.Result.IsSuccess) {
204                         try {
205                             $("#" + options.grid).datagrid('reload');
206                         } catch (e) {
207 
208                         }
209                         callback();
210                         topeveryMessage.show(data.Result.Message);
211                     } else {
212                         try {
213                             topeveryMessage.show(data.Result.Message);
214                         } catch (e) {
215 
216                         }
217                     }
218                 } else {
219                     error();
220                 }
221             }, true);
222         }
223     },
224     ///搜索
225     loadInfo: function (options) {
226         options = $.extend({}, { grid: "grid" }, options || {});
227         $('#' + options.grid).datagrid('load'); //點擊搜索
228     },
229     //清空
230     empty: function (options) {
231         options = $.extend({}, { sumbit: "selectFrom", grid: "grid", tree: "tree" }, options || {});
232         $("#" + options.sumbit).form("reset");
233         $("#" + options.grid).datagrid("load");
234         $('#' + options.tree).find('.tree-node-selected').removeClass('tree-node-selected');
235     }
236 });
TopeveryBase
 1 var DirectoryManageList;
 2 var base;
 3 var load;
 4 var defaultDeptId;
 5 var tree;
 6 $(function () {
 7     DirectoryManageList = TopeveryBase.extend({
 8     });
 9     load = function (row) {
10         $("#LoginPassword1").textbox("setValue", row.LoginPassword);
11     }
12     base = new DirectoryManageList();
13     var columns = [
14         [
15             { field: "Id", checkbox: true },
16             { width: 100, title: '用戶名', field: 'Name', align: 'center' },
17             { width: 100, title: '登錄名', field: 'LoginName', align: 'center' },
18             { width: 100, title: '電話', field: 'TelNum', align: 'center' },
19             {
20                 width: 100, title: '默認部門', field: 'DefaultDeptName', align: 'center'
21             },
22             { width: 100, title: '郵件', field: 'Email', align: 'center' },
23             { width: 80, title: '手機', field: 'MobileNum', align: 'center' },
24             {
25                 title: '操作',
26                 field: 'Action',
27                 width: '15%',
28                 align: 'center',
29                 formatter: function (value, row, index) {
30                     var c = ' <a href="#"   class="easyui-modifyoperate"  onclick="base.View(' + row.Id + ',load)">修改</a>';
31                     var d = ' <a href="#"   class="easyui-modifyoperate"  onclick="base.View(' + row.Id + ',load)">部門角色權限</a>';
32                     return c + "&nbsp"+d;
33                 }
34             }
35         ]
36     ];
37     base.initGrid({ columns: columns });
38     $('#DefaultDeptId').combotree({
39         url: "/Dept/GetDeptList",
40         panelHeight: 'auto',
41         panelMaxHeight: 150,
42         loadFilter: function (data) {
43             var object = new Array;
44             object.push({ id: 0, text: " ", children: data, state: "0", attributes: "" });
45             return object;
46         }
47     }),
48     $('#tree').tree({
49         url: "/Dept/GetDeptList",
50         loadFilter: function (data) {
51             var object = new Array;
52             object.push({ id: 0, text: "部門樹", children: data, state: "0", attributes: "" });
53             return object;
54         },
55         onClick: function (node) { //單擊事件  
56             defaultDeptId = node.id;
57             $("#defaultDeptId").val(defaultDeptId);
58             base.loadInfo();
59         }
60     });
61 });
實例Js
@using System.Web.Optimization
<div style="width: 10%; float: left; height: 100%; background-color: #fff;">
    <ul id="tree"></ul>
</div>
<table style="width: 90%!important; float: left;" singleSelect="false" id="grid" url="UserR/GetListAsync"></table>
<div id="toolbarWrap">
    <div class="toolbar-area">
        <div class="searching-area">
            <form name="selectFrom" id="selectFrom">
                <table>
                    <tr>
                        <td>
                            <input class="easyui-textbox" style="width: 120px; height: 30px;" id="Name1" name="Name" data-options="prompt:'用戶名'" />
                            <input class="easyui-textbox" style="width: 120px; height: 30px;" id="LoginName1" name="LoginName" data-options="prompt:'登錄名'" />
                            <input id="defaultDeptId" name="defaultDeptId" style="display: none;" />
                            <a href="#" class="search-btn easyui-normalyellowbutton" onclick="base.loadInfo();">查詢</a>
                            <a href="#" class="search-btn easyui-normalyellowbutton" onclick="base.empty();">清空</a>
                        </td>
                    </tr>
                </table>
            </form>
        </div>
    </div>
    <div id="toolbar" class="toolbar operate-area-new">
        <a href="#" onclick="base.View();" class="easyui-normalbluebutton">新增用戶</a>
        <a href="#" onclick="base.delData();" class="easyui-normalbluebutton">刪除用戶</a>
        <input type="hidden" id="edit" name="NewModifView" url="UserW/UserAddEditAsync,UserR/GetOneAsync">
        <input type="hidden" id="add" name="NewModifView" url="UserW/UserAddEditAsync">
        <input type="hidden" id="delete" url="UserW/DeleteUserAsync">
    </div>
</div>
<div class="easyui-dialog" title="新增" data-options="iconCls:'pag-list',modal:true,collapsible:false,minimizable:false,maximizable:false,resizable:false,closed:true" id="NewModifView" style="width: 700px; height: 380px;  display: none;">
    <form id="sumbitForm" name="sumbitForm">
        <div class="house-lost-register-form">
            <input id="Id" name="Id" style="display: none;" />
            <p>
                <label>用戶名:</label>
                <input type="text" class="easyui-textbox" maxlength="20" style="width: 215px; height: 30px;" id="Name" name="Name" required="required" missingMessage="用戶名不能為空" />
                <label>登錄名:</label>
                <input type="text" class="easyui-textbox" style="width: 215px; height: 30px;" id="LoginName" name="LoginName" required="required" missingMessage="登錄名不能為空" />
            </p>
            <p>
                <label>登錄密碼:</label>
                <input type="text" class="easyui-textbox" style="width: 215px; height: 30px;" id="LoginPassword" name="LoginPassword" required="required" missingMessage="登錄密碼不能為空" />
                <label>重復登錄密碼:</label>
                <input type="text" class="easyui-textbox" style="width: 215px; height: 30px;" id="LoginPassword1" name="LoginPassword1" required="required" missingMessage="重復登錄密碼不能為空" validType="equalTo['#LoginPassword']" invalidMessage="兩次輸入密碼不匹配" />
            </p>
            <p>
                <label>默認部門:</label>
                <input type="text" class="easyui-combotree" style="width: 215px; height: 30px;" id="DefaultDeptId" name="DefaultDeptId" />
                <label>電話:</label>
                <input type="text" class="easyui-textbox" style="width: 215px; height: 30px;" id="TelNum" name="TelNum" />
            </p>
            <p>
                <label>郵件:</label>
                <input type="text" class="easyui-textbox" style="width: 215px; height: 30px;" id="Email" name="Email" />
                <label>手機:</label>
                <input type="text" class="easyui-textbox" style="width: 215px; height: 30px;" id="MobileNum" name="MobileNum" />
            </p>
            <div style="padding-top: 20px; text-align: center;" id="ToView">
                <a href="#" class="easyui-normalbluebutton" id="save">確認</a>
            </div>
        </div>
    </form>
</div>

@Scripts.Render("~/js/User/IndexTest.js")
View

如果是簡單的增刪改查,就能夠通過簡單的一個頁面就可以完成了。

 /// <summary>
        /// 去掉集合2中Id集合2中的數據
        /// </summary>
        /// <typeparam name="TF"></typeparam>
        /// <returns></returns>
        public IQueryable<TF> NotShorthand<TF>(List<IdInput> list, IRepository<TF> iRepository) where TF : class, IEntity<int> 
        {
            var idlist = new int[list.Count];
            for (var i = 0; i < list.Count; i++)
            {
                idlist.SetValue(list[i].Id, i);
            }
            var query = from t in iRepository.GetAll()
                        where !(idlist).Contains(t.Id)
                        select t;
            return query;
        }

        /// <summary>
        /// 排序  分頁封裝
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="TF"></typeparam>
        /// <returns></returns>
        public async Task<PagedResultOutputDto<TF>> GetListAsync<T,TF>(IQueryable<T> query,int pageIndex,int pageCount,string sort)
        {
            query = !string.IsNullOrWhiteSpace(sort) ? query.OrderBy(sort) : query.OrderBy("Id desc");
            var count = query.Count();
            query = query.Skip((pageIndex - 1) * pageCount).Take(pageCount);
            var row = await query.ToListAsync();
            var data = row.MapTo<List<TF>>();
            return new PagedResultOutputDto<TF>(count, data);
        }
 /// <summary>
        /// 根據部門Id獲取可以調入的人員
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public async Task<PagedResultOutputDto<UserListOutputDto>> GetNotUserAsync(DeptListInput input)
        {
            var query1 = (from userDept in _userDeptRepository.GetAll()
                          join dept in _deptRepository.GetAll() on userDept.DeptId equals dept.Id
                          where userDept.DeptId == input.DeptId
                          select new IdInput { Id = userDept.UserId }).ToList();
            var query = NotShorthand(query1, _userRepository);
            if (!string.IsNullOrWhiteSpace(input.Name))
            {
                query = query.Where(x => x.Name.Contains(input.Name));
            }
            var list = await GetListAsync<Zero.Core.Authorization.User, UserListOutputDto>(query, input.PageIndex, input.PageCount, input.Sorting);
            return list;
        }
View Code

 

4.最后總結是,也許我自己也不知道我的目的是什么,弄這個的意義是什么,但是做自己想做的,想到了就去做吧。

5.發現問題,然后思考問題,最后去解決這個問題!

百度雲地址:http://pan.baidu.com/s/1c2cjpLm  提取碼:4b66




免責聲明!

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



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