本人供職於國內一家比較知名的物流公司,一直從事於基層公司物流軟件的規劃和設計開發工做,在長期的工做實踐中深深地體會到做爲不是專業的軟件行業而又從事軟件開發行業的業餘性的軟件開發設計人員來講,在工做中須要克服的困難和麪對的艱辛有多大多難。數據庫
對與專業的軟件開發設計公司來講,毋庸置疑的一點是都會有本身成熟穩定的開發框架和組件,而且是在不斷的完善中,對供職其中的開發設計人員在完成業務性的開發設計工做外平常工做的一個重心就在於瞭解、熟悉進而創新性的完善他。做爲軟件開發設計人員都知道,任何一個軟件系統都離不開用戶管理、權限管理等作爲核心存在的基本功能,而這僅是上述所說成熟穩定的開發框架和組件的其中一部分。正由於有了成熟穩定開發框架和組件,設計開發人員並不須要去從新構建,從效率和易用性的考慮這節省了大量的開發時間,而且框架強制使用公共的約定,所以它能有效地解決一些共有的問題,也能避免咱們寫一大堆自定義模塊來實現這些性能,咱們所須要作的就是將這些共用模塊放在框架中實現。框架節省了咱們很多的時間和精力,而且讓擴展變得更容易。框架
以上做爲拋磚引玉,如今回到正題。近期考慮爲公司(本人供職的基層公司,如下所稱的公司均同此)構建一個倉庫管理方面的信息系統。在此以前,基於本身的愛好和公司實際業務的須要,曾經屢次嘗試利用本身所學(2011年開始接觸學習C#)的技術來構建一個相對穩定成熟的業務系統,以知足本身的「虛榮心」和公司業務的實際須要,也嘗試過使用一些第三方的開源的技術和框架,可一直沒有能找到一個相對穩定且開發快捷的途徑,大量的時間浪費在尋找框架工具和核心基礎功能上,不光花費了大量的時間,所開發的代碼不管質量仍是執行效率都不盡人意,且代碼無所謂乾淨清晰,估計如今讓我本身讀起來都有些費勁。數據庫設計
其實算起來從最初接觸《走火入魔權限管理系統》是在2012年了,那個時候接觸的仍是網上免費的V3.2的版本,隨着這幾年來軟件做者的持續改進,代碼質量和功能日趨完善。到2013年11月,當V4.0版本出來時,感受到了軟件的強大和對本身往後工做學習的幫助,毅然以我的名義定購了源碼(呵呵,花的是我的的MONEY,雖然當時有點肉痛,不過通過近半年的接觸學習,以爲仍是物有所值的)。工具
在接觸到新源碼後,不到一星期就開始準備以一個簡單進銷存爲業務藍本着手,抱着在實踐中學習,在學習中完善的心態開始開發練習。固然這是在對做者代碼質量和核心功能(用戶權限管理)充分承認的基礎上纔可行的。因爲做者的源碼已經包含了全部的關於用戶以及權限的核心功能,因此在開始開發時我基本上都沒考慮這方面的開發(要知道這個但是我之前花了近兩年的時間也沒有總結出來的經驗,如今有現成的哪能不拿來就用呢,況且功能還那麼強大),直接就以業務藍本着手,開始規劃業務流程、數據庫設計、界面設計(基本上也都是參考),並開始編碼。說到編碼,做者也充分考慮到了代碼的規範性的要求,提供了一個通用的代碼生成工具,系統所須要的基本功能在設計好數據庫的基礎上一鍵生成,極大的提升了代碼開發的質量和效率,並且所生成的代碼可讀性更強、效率更高、更易被其餘軟件開發者所接受,要實現稍微複雜一點的業務邏輯也只須要少許代碼的改變就能完成。整個《進銷存業務系統》從設計到開發,真正的代碼開發(含數據庫建表、界面開發)不到1月的時間。性能
如下是開發實例:學習
界面主頁面實現左欄手風琴菜單,先看效果:this
實現步驟:編碼
一、 在主頁面上拖入一個DX的navbarcontrol控件,排好版,參數默認spa
二、編寫核心代碼:設計
三、 private void Link_ItemClick(object sender, NavBarLinkEventArgs e)
四、 {
五、 ShowForm((NavBarItem)sender);
六、 }
七、
八、 #region private void LoadTreeModule(TreeNode treeNode) 加載模塊菜單
九、 /// <summary>
十、 /// 加載模塊菜單
十一、 /// </summary>
十二、 /// <param name="group">當前節點</param>
1三、 private void LoadModule(List<BaseModuleEntity> moduleEntities, NavBarGroup group)
1四、 {
1五、 int i = 0;
1六、 foreach (BaseModuleEntity moduleEntity in moduleEntities) //以每一個子菜單作循環
1七、 {
1八、 if (moduleEntity.ParentId == int.Parse(group.Name.Trim()))
1九、 {
20、 NavBarItem groupItem = new NavBarItem(); //爲每一個子菜單建立新item,構造體中傳遞子菜單名,和子菜單ID
2一、 groupItem.LargeImageIndex = groupItem.SmallImageIndex = string.IsNullOrEmpty(moduleEntity.ImageIndex) ? i : int.Parse(moduleEntity.ImageIndex);
2二、 groupItem.Caption = moduleEntity.FullName;
2三、 groupItem.Tag = moduleEntity.FormName;
2四、 groupItem.Hint = moduleEntity.AssemblyName;
2五、 groupItem.LinkClicked += Link_ItemClick;
2六、 group.ItemLinks.Add(groupItem); //在每一個組裏添加子菜單
2七、
2八、 i += 1;
2九、 }
30、 }
3一、 }
3二、 #endregion
3三、
3四、
3五、 #region private void LoadTree() 加載樹形結構數據
3六、 /// <summary>
3七、 /// 加載樹形結構數據
3八、 /// </summary>
3九、 private void LoadTree()
40、 {
4一、 this.navBarControl1.Groups.Clear();//清空控件的值
4二、
4三、 // 這裏是須要加載的跟節點主鍵
4四、 int? rootMenuId = null;
4五、 int i = 0;
4六、
4七、 DotNetService dotNetService = new DotNetService();
4八、 List<BaseModuleEntity> moduleEntitys = ClientPermissionCache.Instance.UserModuleList;
4九、
50、 rootMenuId = 10005235;
5一、 foreach (BaseModuleEntity moduleEntity in moduleEntitys)
5二、 {
5三、 //~這部分能夠單獨調優,只是爲了把左側功能欄項加載好,要新增項只需修改判斷條件。
5四、 //if (string.IsNullOrEmpty(dr[BaseModuleEntity.FieldParentId].ToString()))
5五、 if (moduleEntity.ParentId == rootMenuId)
5六、 {
5七、 //添加Group
5八、
5九、 NavBarGroup group = navBarControl1.Groups.Add(); // 爲每一個主菜單建立個新分組
60、 group.Caption = moduleEntity.FullName;
6一、 group.LargeImageIndex = group.SmallImageIndex = string.IsNullOrEmpty(moduleEntity.ImageIndex) ? i : int.Parse(moduleEntity.ImageIndex);// Convert.ToInt32(row[BaseModuleTable.FieldImageIndex]);
6二、 group.Tag = moduleEntity.Target;
6三、 group.Name = moduleEntity.Id.ToString();
6四、 i += 1;
6五、
6六、 LoadModule(moduleEntitys, group);
6七、
6八、 }
6九、 }
70、 }
7一、 #endregion
記得在初始化窗體時調用就OK了。調用的代碼:this.LoadTree();
如下是系統銷售訂單主界面