亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

領域驅動設計實戰—基于DDDLite的權限管理OpenAuth.net

2019-11-14 14:34:26
字體:
來源:轉載
供稿:網友

        在園子里面,搜索一下“權限管理”至少能得到上千條的有效記錄。記得剛開始工作的時候,寫個通用的權限系統一直是自己的一個夢想。中間因為工作忙(其實就是懶!)等原因,被無限期擱置了。最近想想,自己寫東西時,很多都是偏理論方面的,常常找不到合適的例子來論證自己的觀點。于是用業余時間來寫點東西。

園子中的權限管理系統有以下幾種:

  1. 寫的好的,界面NB的,但不開源,畢竟人家辛辛苦苦的勞動成果;
  2. 寫的好的,也公開源碼,但不公開數據庫設計和一些流程設計,你得看著源碼去猜字段去猜流程;
  3. 不定期講源碼和放截圖的,丫的就是不放出項目的,這種同1,就是沒事換個馬甲來水點廣告;
  4. 入門級的,開放源碼的,但那源碼實在是不想多看兩眼;

什么也不說了,開干!文字太多了,來個動態圖緩一緩:

screen

需求

        首先,做個東西必須要把需求搞清楚。園子里面的權限管理需求分析的比較合理的,應該是蕭秦的我的權限系統設計實現MVC4 + WebAPI + EasyUI + Knockout(一) ,具體總結如下:

1、權限資源
    a.菜單權限  經理和業務員登陸系統擁有的功能菜單是不一樣的
    b.按鈕權限  經理能夠審批,而業務員不可以
    c.數據權限  A業務員看不到B業務員的單據
    d.字段權限  某些人查詢客戶信息時看不到客戶的手機號或其它字段

2、用戶,應用系統的具體操作者,我這里設計用戶是不能直接分配權限的,必須要分配一個角色,角色中再分配權限,如果某個用戶權限比較特殊,可以為他專門建一個角色來應用解決,因為如果用戶也可以分配權限系統就會復雜很多?!疚也捎玫倪€是可以直接給用戶分配菜單/按鈕,畢竟我們的人員就喜歡搞些特殊待遇】

3、角色,為了對許多擁有相似權限的用戶進行分類管理,定義了角色的概念,以上所有的權限資源都可以分配給角色,角色和用戶N:N的關系。

4、機構,樹形的公司部門結構,國內公司用的比較多,它實際上就是一個用戶組,機構和用戶設計成N:N的關系,也就是說有時候一個用戶可以從屬于兩個部門,這種情況在我們客戶需求中的確都出現過。

設計

        本來想用DDD(也就是把CQRS/AES等一堆的東西全用上,如果你想學習完整的DDD框架,可以參考我的另一個項目BestQ&A --開源中國推薦項目/集CQRS AES等DDD高級特性于一體的問答系統)實現這個項目,思考再三還是被自己否定了。畢竟自己也在學習真正的領域驅動設計,思想上不是很成熟。再者,我相信對于普通的經典DDD架構(好高大上的說,悄悄地告訴你其實就是分層分的格調不一樣?。?,我是有絕對的信心可以把控的。

與其他權限管理相同的地方

        使用了萬惡的EF+MVC結構,當然,我沒惡俗到用EasyUI,為了體現個性,選擇了酷炫的基于bootstrap的B-JUI前端(炫不炫,你說了算)。相同的東西總是無趣,你可以無視,請把注意力放在下面。

與其他權限管理不同的地方

1、項目采用經典DDD架構(用沃恩.弗農大神的話,其實這是DDD-Lite)思想進行開發,簡潔而不簡單,實用至上,并且所寫每一行代碼都經過深思熟慮,采用Autofac對項目進行解耦,符合S.O.L.I.D規則!來秀一下內在美:

using OpenAuth.Domain;using OpenAuth.Domain.Interface;using System;using System.Collections.Generic;using System.Linq;namespace OpenAuth.App{    public class OrgManagerApp    {        PRivate IOrgRepository _repository;        public OrgManagerApp(IOrgRepository repository)        {            _repository = repository;        }        public IList<Org> GetAll()        {            return _repository.LoadOrgs().ToList();        }        /// <summary>        /// 部門的直接子部門        /// <para>TODO:可以根據用戶的喜好決定選擇LoadAllChildren或LoadDirectChildren</para>        /// </summary>        public IList<Org> LoadDirectChildren(int orgId)        {            return _repository.Find(u => u.ParentId == orgId).ToList();        }        /// <summary>        /// 得到部門的所有子部門        /// <para>如果orgId為0,表示取得所有部門</para>        /// </summary>        public IList<Org> LoadAllChildren(int orgId)        {            string cascadeId = "0.";            if (orgId != 0)            {                var org = _repository.FindSingle(u => u.Id == orgId);                if (org == null)                    throw new Exception("未能找到指定對象信息");                cascadeId = org.CascadeId;            }            return _repository.Find(u => u.CascadeId.Contains(cascadeId) && u.Id != orgId).ToList();        }        /// <summary>        /// 添加部門        /// </summary>        public int AddOrUpdate(Org org)        {            if (org.Id == 0)            {                ChangeModuleCascade(org);                _repository.Add(org);            }            else            {                _repository.Update(org);            }            return org.Id;        }        /// <summary>        /// 刪除指定ID的部門及其所有子部門        /// </summary>        public void DelOrg(int id)        {            var delOrg = _repository.FindSingle(u => u.Id == id);            if (delOrg == null) return;            _repository.Delete(u => u.CascadeId.Contains(delOrg.CascadeId));        }        #region 私有方法        //修改對象的級聯ID,生成類似XXX.XXX.X.XX        private void ChangeModuleCascade(Org org)        {            string cascadeId;            int currentCascadeId = 1;  //當前結點的級聯節點最后一位            var sameLevels = _repository.Find(o => o.ParentId == org.ParentId && o.Id != org.Id);            foreach (var obj in sameLevels)            {                int objCascadeId = int.Parse(obj.CascadeId.Split('.').Last());                if (currentCascadeId <= objCascadeId) currentCascadeId = objCascadeId + 1;            }            if (org.ParentId != 0)            {                var parentOrg = _repository.FindSingle(o => o.Id == org.ParentId);                if (parentOrg != null)                {                    cascadeId = parentOrg.CascadeId + "." + currentCascadeId;                    org.ParentName = parentOrg.Name;                }                else                {                    throw new Exception("未能找到該組織的父節點信息");                }            }            else            {                cascadeId = "0." + currentCascadeId;                org.ParentName = "根節點";            }            org.CascadeId = cascadeId;        }        #endregion 私有方法    }}

2、教科書級的分層思想,哪怕苛刻的你閱讀的是大神級經典大作(如:《企業應用架構模式》《重構與模式》《asp.net設計模式》等),你也可以參考本項目。不信?有圖為證,Resharper自動生成的項目引用關系,毫無PS痕跡!

architect

記得以前弦子哥寫過一篇園子里面搭構架對比的文章(.Net項目分層與文件夾結構大全(最佳架子獎,吐槽獎,陰溝翻船獎揭曉)),本想也建他10幾個項目,想一想還是算了,折騰讀的人也折騰我自己。畢竟我的項目還沒有分布式的需求,就算有,也得遵循分布式設計的最高準則------能不用分布式就不要用!

所以精簡到6個項目,個個都是精華!

所有項目都依賴于領域層,而領域層不關心任何數據庫實現或界面UI實現;

通過依賴注入真正實現了上層與數據庫分離,雖然數據庫訪問采用了EF的方式,但WEB層對此毫不知情!

3、經過N次優化的數據庫結構設計。本來數據庫核心表中有很多多對多的關系(用戶與機構/用戶與角色/角色與模塊等等),如下:

pdm1

代碼寫到一半的時候,覺得何苦呢,為什么以前設計權限的人都喜歡這么設計?去你的,看我的:

pdm2

瞬間少了很多,代碼風格也可以統一起來,多美好的事情啊。你會問:所有多對多關系放在一張表,性能怎么辦?什么?性能?沒有千萬級數據,別和我提性能。如果你的系統幾十萬數據時都會很卡,還是去惡補一下數據庫基礎吧!

界面

人要臉樹要皮,沒圖沒真相!

login

add

 

user

Module

 

源碼及說明

 

項目地址:https://git.oschina.net/yubaolee/OpenAuth.Net

 

源碼中包含所有的程序代碼,數據庫PowerDesigner設計圖,CodeSmith生成模板,數據庫初始腳本。請下載源碼后,先用Nuget還原引用的第三方包,再修改一下web.config里面的連接字符串。

當前代碼已經實現核心功能如下:

  • 模塊/用戶/部門/角色的分級管理;
  • 為用戶分配角色或直接為用戶分配模塊;
  • 根據模塊URL地址與MVC的Controller適配授權;
  • 頁面菜單按鈕分配;
  • 內部已經集成log4net,只需要簡單的 LogHelper.Log("日志內容") 即可;

最近開發功能展望:

  • 菜單授權處理;
  • 數據權限處理;
  • 用戶分級授權功能;

 

短短一文怎么能表達完一個項目的功能與思想!在后續的博客中,我會結合自己對企業開發的一些看法,對DDD的一些看法,對重構的一些看法,等等等等,來講述自己的程序人生。

 

本博客其他精彩內容:http://www.49028c.com/yubaolee/p/Catalogue.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人一区二区三区电影| 51色欧美片视频在线观看| 欧美日韩亚洲视频| 日韩中文字幕在线| 91免费视频网站| 中文字幕精品一区久久久久| 亚洲成年人影院在线| 深夜福利一区二区| 国产亚洲欧美一区| 欧美极品美女视频网站在线观看免费| 国产精品视频一区国模私拍| 亚洲欧美国产一区二区三区| 日韩在线视频网站| 色综合天天狠天天透天天伊人| 久久男人资源视频| 正在播放欧美一区| 中文字幕精品一区久久久久| 日韩一区二区精品视频| 欧美自拍视频在线观看| 国产精品欧美亚洲777777| yw.139尤物在线精品视频| 国产一区二区三区在线观看视频| 在线亚洲午夜片av大片| 久久久影视精品| 中文字幕免费国产精品| 欧美成年人视频| 麻豆国产va免费精品高清在线| 久久亚洲一区二区三区四区五区高| 日韩精品在线免费观看视频| 欧美激情乱人伦| 国产精品毛片a∨一区二区三区|国| 亚洲国产中文字幕在线观看| 久久男人资源视频| 亚洲国模精品一区| 亚洲网址你懂得| 成人h猎奇视频网站| 伊人伊成久久人综合网小说| 成人啪啪免费看| 亚洲综合社区网| 日韩欧美在线字幕| 亚洲最大福利视频| 92裸体在线视频网站| 中文国产成人精品久久一| 欧美高清电影在线看| 久久成人人人人精品欧| 久久精品欧美视频| 97在线观看视频国产| 综合欧美国产视频二区| 成人免费xxxxx在线观看| 国产日韩欧美在线播放| 日韩精品在线观看网站| 亚洲成人精品视频在线观看| 国产精品第3页| 国产va免费精品高清在线| 96pao国产成视频永久免费| 久久久最新网址| 成人av在线天堂| 黑人巨大精品欧美一区二区一视频| 国产精品美女免费看| 在线看片第一页欧美| 欧美激情欧美激情在线五月| 成人精品一区二区三区电影免费| 日韩精品在线观看视频| 97久久超碰福利国产精品…| 青草青草久热精品视频在线网站| 福利二区91精品bt7086| 尤物99国产成人精品视频| 日韩精品视频免费专区在线播放| 一本色道久久综合亚洲精品小说| 国产精品稀缺呦系列在线| 成人性生交大片免费看小说| 国内揄拍国内精品| 国产精品美女主播在线观看纯欲| yellow中文字幕久久| 欧美激情视频网站| 国产精品麻豆va在线播放| 日韩高清中文字幕| 国产精品手机播放| 久久综合国产精品台湾中文娱乐网| 亚洲欧美在线x视频| 日韩av在线网| 国产精品吊钟奶在线| 大量国产精品视频| 欧美日韩国产精品一区二区三区四区| 主播福利视频一区| 欧美疯狂做受xxxx高潮| 中文字幕欧美精品在线| 色婷婷综合久久久久中文字幕1| www.亚洲免费视频| 精品一区二区三区三区| 亚洲大胆人体av| 亚洲第一区中文字幕| 岛国av一区二区在线在线观看| 国产精品久久久久久久app| 性夜试看影院91社区| 亚洲天堂一区二区三区| 色综合五月天导航| 自拍偷拍亚洲精品| 久久久久久久久久久网站| 久久久久久噜噜噜久久久精品| 久久久精品视频成人| 亚洲精品视频网上网址在线观看| 欧美丝袜第一区| 在线观看视频99| 日韩欧美主播在线| 日韩高清免费观看| 成人女保姆的销魂服务| 久久久久久久久久av| 国产成人午夜视频网址| 91精品视频在线| 日韩精品亚洲精品| 亚洲第一精品久久忘忧草社区| 大桥未久av一区二区三区| 欧美日韩成人在线播放| 热久久99这里有精品| 久久av.com| 亚洲精品99久久久久| 综合网日日天干夜夜久久| 在线视频欧美日韩精品| 51ⅴ精品国产91久久久久久| 91久久精品国产91久久性色| 久久精品中文字幕免费mv| 国产精品入口夜色视频大尺度| 国产精品无av码在线观看| 国产精品视频精品| 九九九久久国产免费| 亚洲精品资源美女情侣酒店| 欧美激情第99页| 欧美电影电视剧在线观看| yw.139尤物在线精品视频| 日韩精品免费视频| 久久国产精品偷| 久久久亚洲精选| 亚洲精品日韩av| 久久久人成影片一区二区三区| 国产精品第一区| 国产精品永久免费视频| 亚洲福利在线看| 国内揄拍国内精品少妇国语| 久久激情视频久久| 欧美激情亚洲精品| 91亚洲精品视频| 日韩禁在线播放| 亚洲精品成人免费| 亚洲视频欧洲视频| 日韩人在线观看| 亚洲综合日韩在线| 精品视频久久久| 国产精品av在线| 国产日韩欧美成人| 久久综合久久美利坚合众国| 夜夜狂射影院欧美极品| 91久久久久久久久久| 中文字幕日韩在线观看| 国产一区二区三区在线免费观看| 青草青草久热精品视频在线网站| 91精品国产综合久久男男| 亚洲精品久久久久中文字幕二区| 日韩av第一页| 欧美一级视频免费在线观看| 成人a级免费视频| 日韩欧美极品在线观看| 日韩电影中文字幕av| 精品视频偷偷看在线观看|