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

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

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

2019-11-14 14:25:09
字體:
來源:轉載
供稿:網友

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

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

  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
色香阁99久久精品久久久| 97在线看免费观看视频在线观看| 欧美极品少妇xxxxⅹ喷水| 91免费综合在线| 国产日韩欧美日韩大片| 91高清视频在线免费观看| 亚洲精品v欧美精品v日韩精品| 亚洲女人天堂色在线7777| 成人免费在线网址| 国产精品久久久久久av| 在线免费看av不卡| 97在线视频精品| 久久久久久com| 91久久久亚洲精品| 国产ts一区二区| 国产亚洲激情视频在线| 久久人人爽人人| 性欧美xxxx交| 国产视频久久久| 国内精品小视频在线观看| 91美女片黄在线观看游戏| 色樱桃影院亚洲精品影院| 亚洲国产精品va在线看黑人动漫| 欧美成人国产va精品日本一级| 91成人精品网站| 国模私拍一区二区三区| 麻豆国产精品va在线观看不卡| 在线电影中文日韩| 在线精品视频视频中文字幕| 91精品视频观看| 中文字幕日韩av电影| 国产视频999| 国产亚洲福利一区| 亚洲视频综合网| 日韩精品免费视频| 日韩精品在线视频观看| 97色在线视频观看| 欧美成aaa人片在线观看蜜臀| 久久成人精品视频| 国产精品狼人色视频一区| 91精品久久久久久久久久另类| 亚洲色图偷窥自拍| 精品久久久久久久久久久| 91精品国产综合久久香蕉| 不卡中文字幕av| 在线观看欧美日韩国产| 国产成人高潮免费观看精品| 国产精品亚洲一区二区三区| 欧美视频中文字幕在线| 久久琪琪电影院| 国产91在线高潮白浆在线观看| 欧美性极品xxxx做受| 亚洲国产欧美一区二区三区同亚洲| www.午夜精品| 国内成人精品一区| 成人免费网站在线| 欧美午夜影院在线视频| 亚洲欧美制服另类日韩| 北条麻妃一区二区在线观看| 日韩av在线高清| 亚洲免费影视第一页| 国产精品一区二区三区毛片淫片| 成人黄色片网站| 美乳少妇欧美精品| 久久精视频免费在线久久完整在线看| 精品国产欧美一区二区三区成人| 国产精品看片资源| 高跟丝袜一区二区三区| 精品久久久久久中文字幕| 国产精品美女免费视频| 欧美美女操人视频| 国产精品免费久久久久影院| 欧美黑人狂野猛交老妇| 久久国产精品影视| 这里只有精品在线观看| 色婷婷av一区二区三区久久| 成人天堂噜噜噜| 国产欧美在线视频| 另类专区欧美制服同性| 国产亚洲激情在线| 久久久久久伊人| 成人夜晚看av| 午夜免费久久久久| 亚洲欧美国产制服动漫| 国产欧美婷婷中文| 亚洲色图在线观看| 国产极品jizzhd欧美| 日韩动漫免费观看电视剧高清| 国产精品久久久久久久久久久新郎| 久久久女人电视剧免费播放下载| 97免费视频在线播放| 性夜试看影院91社区| 国产午夜精品一区二区三区| 成人有码在线播放| 久久99精品久久久久久琪琪| 成人欧美一区二区三区黑人孕妇| 91精品国产自产在线观看永久| 久久99国产精品久久久久久久久| 91欧美精品成人综合在线观看| 黑人与娇小精品av专区| 中文字幕亚洲欧美在线| 欧美一区二三区| 性色av一区二区三区免费| 国产在线观看不卡| 亚洲国产精品成人va在线观看| 久久偷看各类女兵18女厕嘘嘘| 欧美在线一区二区视频| 亚洲国产日韩精品在线| 久久久噜噜噜久久久| 亚洲社区在线观看| 一区二区国产精品视频| 高清一区二区三区日本久| 亚洲视频在线观看免费| 2018日韩中文字幕| 亚洲欧洲日产国码av系列天堂| 色午夜这里只有精品| 97在线精品国自产拍中文| 欧美激情视频播放| 亚洲精品综合久久中文字幕| 一本一道久久a久久精品逆3p| 亚洲国产小视频在线观看| 91免费综合在线| 高清在线视频日韩欧美| 中文字幕亚洲图片| 久久久久久久久国产精品| 欧美性xxxx极品高清hd直播| 欧美第一黄网免费网站| 91九色视频导航| 欧美成人剧情片在线观看| 日本高清+成人网在线观看| 国产精品久久视频| 亚洲国产又黄又爽女人高潮的| 亚洲加勒比久久88色综合| 国产欧美在线视频| 国产精品久久久久久久久| 91色在线视频| 成人免费大片黄在线播放| 日韩美女av在线| 亚洲人成电影网站色| 欧美裸身视频免费观看| 亚洲欧洲在线观看| 欧美日韩国产成人高清视频| 91精品国产综合久久久久久蜜臀| 亚洲缚视频在线观看| 日韩中文av在线| 欧美xxxx18性欧美| 久久国产精品久久久久久| 欧美成人免费全部观看天天性色| 国产精品美乳一区二区免费| 亚洲欧美日韩一区二区三区在线| 亚洲理论在线a中文字幕| 色无极影院亚洲| 亚洲国产精品yw在线观看| 亚洲成成品网站| 日韩av男人的天堂| 欧美亚洲免费电影| 日韩中文字幕在线看| 日韩av观看网址| 午夜精品久久17c| 4k岛国日韩精品**专区| 亚洲а∨天堂久久精品9966| 久久亚洲精品成人| 97在线观看免费高清| 亚洲 日韩 国产第一|