使用通用權限管理系統組件的隨想 - 提高開發能力、規范開發、快速見效


   本人供職於國內一家比較知名的物流公司,一直從事於基層公司物流軟件的規划和設計開發工作,在長期的工作實踐中深深地體會到作為不是專業的軟件行業而又從事軟件開發行業的業余性的軟件開發設計人員來說,在工作中需要克服的困難和面對的艱辛有多大多難。

 

   對與專業的軟件開發設計公司來說,毋庸置疑的一點是都會有自己成熟穩定的開發框架和組件,並且是在不斷的完善中,對供職其中的開發設計人員在完成業務性的開發設計工作外日常工作的一個重心就在於了解、熟悉進而創新性的完善他。作為軟件開發設計人員都知道,任何一個軟件系統都離不開用戶管理、權限管理等做為核心存在的基本功能,而這僅是上述所說成熟穩定的開發框架和組件的其中一部分。正因為有了成熟穩定開發框架和組件,設計開發人員並不需要去重新構建,從效率和易用性的考慮這節省了大量的開發時間,並且框架強制使用公共的約定,因此它能有效地解決一些共有的問題,也能避免我們寫一大堆自定義模塊來實現這些性能,我們所需要做的就是將這些共用模塊放在框架中實現。框架節省了我們不少的時間和精力,並且讓擴展變得更容易。

 

    以上作為拋磚引玉,現在回到正題。近期考慮為公司(本人供職的基層公司,以下所稱的公司均同此)構建一個倉庫管理方面的信息系統。在此之前,基於自己的愛好和公司實際業務的需要,曾經多次嘗試利用自己所學(2011年開始接觸學習C#)的技術來構建一個相對穩定成熟的業務系統,以滿足自己的“虛榮心”和公司業務的實際需要,也嘗試過使用一些第三方的開源的技術和框架,可一直沒有能找到一個相對穩定且開發快捷的途徑,大量的時間浪費在尋找框架工具和核心基礎功能上,不光花費了大量的時間,所開發的代碼無論質量還是執行效率都不盡人意,且代碼無所謂干凈清晰,估計現在讓我自己讀起來都有些費勁。

 

   其實算起來從最初接觸《走火入魔權限管理系統》是在2012年了,那個時候接觸的還是網上免費的V3.2的版本,隨着這幾年來軟件作者的持續改進,代碼質量和功能日趨完善。到2013年11月,當V4.0版本出來時,感覺到了軟件的強大和對自己日后工作學習的幫助,毅然以個人名義定購了源碼(呵呵,花的是個人的MONEY,雖然當時有點肉痛,不過經過近半年的接觸學習,覺得還是物有所值的)。

 

   在接觸到新源碼后,不到一星期就開始准備以一個簡單進銷存為業務藍本着手,抱着在實踐中學習,在學習中完善的心態開始開發練習。當然這是在對作者代碼質量和核心功能(用戶權限管理)充分認可的基礎上才可行的。由於作者的源碼已經包含了所有的關於用戶以及權限的核心功能,所以在開始開發時我基本上都沒考慮這方面的開發(要知道這個可是我以前花了近兩年的時間也沒有總結出來的經驗,現在有現成的哪能不拿來就用呢,何況功能還那么強大),直接就以業務藍本着手,開始規划業務流程、數據庫設計、界面設計(基本上也都是參考),並開始編碼。說到編碼,作者也充分考慮到了代碼的規范性的要求,提供了一個通用的代碼生成工具,系統所需要的基本功能在設計好數據庫的基礎上一鍵生成,極大的提高了代碼開發的質量和效率,而且所生成的代碼可讀性更強、效率更高、更易被其他軟件開發者所接受,要實現稍微復雜一點的業務邏輯也只需要少量代碼的改變就能完成。整個《進銷存業務系統》從設計到開發,真正的代碼開發(含數據庫建表、界面開發)不到1月的時間。

 

以下是開發實例:

界面主頁面實現左欄手風琴菜單,先看效果:

                       

實現步驟:

1、  在主頁面上拖入一個DX的navbarcontrol控件,排好版,參數默認

   

2、編寫核心代碼:

 

3、          private void Link_ItemClick(object sender, NavBarLinkEventArgs e)

4、          {

5、              ShowForm((NavBarItem)sender);

6、          }

7、 

8、          #region private void LoadTreeModule(TreeNode treeNode) 加載模塊菜單

9、          /// <summary>

10、         /// 加載模塊菜單

11、         /// </summary>

12、         /// <param name="group">當前節點</param>

13、         private void LoadModule(List<BaseModuleEntity> moduleEntities, NavBarGroup group)

14、         {

15、             int i = 0;

16、             foreach (BaseModuleEntity moduleEntity in moduleEntities) //以每個子菜單做循環

17、             {

18、                 if (moduleEntity.ParentId == int.Parse(group.Name.Trim()))

19、                 {

20、                     NavBarItem groupItem = new NavBarItem(); //為每個子菜單創建新item,構造體中傳遞子菜單名,和子菜單ID

21、                     groupItem.LargeImageIndex = groupItem.SmallImageIndex = string.IsNullOrEmpty(moduleEntity.ImageIndex) ? i : int.Parse(moduleEntity.ImageIndex);

22、                     groupItem.Caption = moduleEntity.FullName;

23、                     groupItem.Tag = moduleEntity.FormName;

24、                     groupItem.Hint = moduleEntity.AssemblyName;

25、                     groupItem.LinkClicked += Link_ItemClick;

26、                     group.ItemLinks.Add(groupItem);  //在每個組里添加子菜單

27、  

28、                     i += 1;

29、                 }

30、             }

31、         }

32、         #endregion

33、  

34、  

35、         #region private void LoadTree() 加載樹形結構數據

36、         /// <summary>

37、         /// 加載樹形結構數據

38、         /// </summary>

39、         private void LoadTree()

40、         {

41、             this.navBarControl1.Groups.Clear();//清空控件的值

42、  

43、             // 這里是需要加載的跟節點主鍵

44、             int? rootMenuId = null;

45、             int i = 0;

46、  

47、             DotNetService dotNetService = new DotNetService();

48、             List<BaseModuleEntity> moduleEntitys = ClientPermissionCache.Instance.UserModuleList;

49、  

50、             rootMenuId = 10005235;

51、             foreach (BaseModuleEntity moduleEntity in moduleEntitys)

52、             {

53、                 //~這部分可以單獨調優,只是為了把左側功能欄項加載好,要新增項只需修改判斷條件。

54、                 //if (string.IsNullOrEmpty(dr[BaseModuleEntity.FieldParentId].ToString()))

55、                 if (moduleEntity.ParentId == rootMenuId)

56、                 {

57、                     //添加Group

58、  

59、                     NavBarGroup group = navBarControl1.Groups.Add();  // 為每個主菜單創建個新分組

60、                     group.Caption = moduleEntity.FullName;

61、                     group.LargeImageIndex = group.SmallImageIndex = string.IsNullOrEmpty(moduleEntity.ImageIndex) ? i : int.Parse(moduleEntity.ImageIndex);// Convert.ToInt32(row[BaseModuleTable.FieldImageIndex]);

62、                     group.Tag = moduleEntity.Target;

63、                     group.Name = moduleEntity.Id.ToString();

64、                     i += 1;

65、  

66、                     LoadModule(moduleEntitys, group);

67、  

68、                 }

69、             }

70、         }

71、         #endregion

 

記得在初始化窗體時調用就OK了。調用的代碼:this.LoadTree();

以下是系統銷售訂單主界面

   

 


免責聲明!

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



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