亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

C# WinForm權限管理系統(tǒng)實踐:基于RBAC模型從數(shù)據(jù)庫設計到按鈕級權限控制

C# WinForm權限管理系統(tǒng)實踐:基于RBAC模型從數(shù)據(jù)庫設計到按鈕級權限控制 簡介一套基于C# WinForm框架開發(fā)的權限管理系統(tǒng)完整源碼包面向需要完成課程設計或快速搭建后臺管理權限模塊的開發(fā)者。系統(tǒng)覆蓋用戶管理、組管理、用戶授權、菜單管理及菜單授權等核心功能后臺默認管理員賬號密碼均為admin開發(fā)環(huán)境為Visual Studio數(shù)據(jù)庫采用SQL Server 2008連接字符串可在app.config中修改。資源共101個文件以cs源碼、resx/resources界面資源、config配置文件、sln/csproj工程文件為主另含mdf/ldf數(shù)據(jù)庫文件、exe可執(zhí)行程序及ico圖標等壓縮包僅1.63MB目錄結構緊湊便于本地調(diào)試與二次開發(fā)。已有497人學習下載適合希望快速理解權限控制流程、完成課設演示或擴展功能的中初級C#開發(fā)者。1. 基于C#的winform框架的權限管理系統(tǒng)附完整源碼數(shù)據(jù)庫到底解決什么問題上一家公司里權限還躺在一張有十七個Sheet的Excel里每次新員工入職要挨個問“你該看哪些菜單”問完還要截圖畫紅線發(fā)給相關人員核對。后來我拿到一套基于C#的winform框架的權限管理系統(tǒng)附完整源碼數(shù)據(jù)庫時第一反應不是打開界面而是先看表和目錄——只要用戶、角色、菜單、按鈕權限落到數(shù)據(jù)庫里新增一個權限點就不再需要發(fā)郵件了。這套方案最適合三類人中小團隊做內(nèi)部管理系統(tǒng)、給上位機配一套帶登錄的后臺、以及想學C/S架構但不想從零寫權限邏輯的開發(fā)者。它能解決的核心問題只有一個把散落在窗體事件里的判斷邏輯收斂成一套可配置、可審計、可復用的RBAC模型。2. 權限管理系統(tǒng)的骨架數(shù)據(jù)表設計、分層架構與源碼包目錄還原拿到壓縮包之后先別急著F5運行先花二十分鐘把結構看懂。常見的做法是三層結構加一個實體層UI層放窗體BLL層寫業(yè)務校驗DAL層做數(shù)據(jù)訪問Model層放實體類Common層放加密和權限判斷等公共方法。這套劃分在中小項目里是性價比最高的選型——比單純把代碼堆在Form后面要好維護又比引入大型框架輕得多。2.1 權限模型的選型RBAC為什么適合WinForm場景WinForm程序的特點是界面事件密集按鈕點擊、窗體加載、DataGridView行雙擊都能觸發(fā)業(yè)務操作如果每個事件里都寫if (currentUser.Role admin)后面改權限就得翻遍整個解決方案。RBAC模型把用戶和權限解耦用戶掛在角色下角色綁定權限點窗體只問“當前用戶有沒有某個權限標識”不關心用戶是誰、屬于哪個角色。這樣新增一個實習生賬號只需要給他掛“訪客”角色而不用改任何代碼。代碼包里如果用了類似HasPermission(order:delete)的統(tǒng)一判斷說明作者走的就是RBAC路線。不選ABAC基于屬性的訪問控制的原因也很簡單——桌面程序的數(shù)據(jù)量級和變化頻率都用不上那么復雜的策略引擎RBAC的平面模型足夠覆蓋90%的內(nèi)部系統(tǒng)需求。后續(xù)如果要做數(shù)據(jù)范圍控制在RBAC上擴展一個數(shù)據(jù)范圍字段就行不需要推翻重來。2.2 核心數(shù)據(jù)表六張表的字段設計與外鍵關系我打開數(shù)據(jù)庫腳本第一件事就是看表數(shù)量權限系統(tǒng)最少要有六張表用戶表、角色表、菜單表、按鈕表或者權限點表、用戶角色關聯(lián)表、角色權限關聯(lián)表。下面是精簡后的建表腳本去掉了審計字段和索引保留了核心結構CREATE TABLE Sys_User ( UserId INT IDENTITY(1,1) PRIMARY KEY, UserName NVARCHAR(50) NOT NULL, PasswordHash NVARCHAR(200) NOT NULL, RealName NVARCHAR(50) NULL, DeptId INT NULL, IsEnabled BIT DEFAULT 1, CreateTime DATETIME DEFAULT GETDATE() ); CREATE TABLE Sys_Role ( RoleId INT IDENTITY(1,1) PRIMARY KEY, RoleName NVARCHAR(50) NOT NULL, DataScope TINYINT DEFAULT 1, -- 1全部 2本部門 3僅本人 Description NVARCHAR(200) NULL ); CREATE TABLE Sys_Menu ( MenuId INT IDENTITY(1,1) PRIMARY KEY, ParentId INT DEFAULT 0, MenuName NVARCHAR(50) NOT NULL, MenuKey NVARCHAR(100) NOT NULL, -- 權限標識如 order:list FormName NVARCHAR(100) NULL, -- 要打開的窗體類名 SortOrder INT DEFAULT 0 ); CREATE TABLE Sys_Button ( ButtonId INT IDENTITY(1,1) PRIMARY KEY, MenuId INT NOT NULL, BtnText NVARCHAR(50) NOT NULL, BtnKey NVARCHAR(100) NOT NULL, -- 權限標識如 order:delete SortOrder INT DEFAULT 0 ); CREATE TABLE Sys_UserRole ( UserRoleId INT IDENTITY(1,1) PRIMARY KEY, UserId INT NOT NULL, RoleId INT NOT NULL ); CREATE TABLE Sys_RoleButton ( RoleButtonId INT IDENTITY(1,1) PRIMARY KEY, RoleId INT NOT NULL, ButtonId INT NOT NULL );這段腳本有四個地方值得關注。第一MenuKey和BtnKey用冒號分隔的層級命名規(guī)則是“模塊:操作”這比存中文名稱要穩(wěn)因為界面文案可以隨便改但權限標識一旦改了所有權限判斷的地方都要跟著改。第二Sys_UserRole和Sys_RoleButton是純關聯(lián)表不需要業(yè)務字段加IDENTITY主鍵是為了方便按行做日志審計。第三DataScope字段放在角色表而不是用戶表因為數(shù)據(jù)范圍通常按角色統(tǒng)一控制比如銷售部經(jīng)理看全部門訂單銷售員只看自己的。第四所有表都留了CreateTime這樣的基礎審計列WinForm程序沒有中間件幫你記錄操作日志表自己不帶時間字段后面根本沒法排查問題。2.3 從源碼包還原項目結構目錄命名與主窗體啟動流程解壓后常見的項目結構是這樣一個單頁簽解決方案頂層是解決方案文件下面按層建文件夾UI層里是登錄窗體、主窗體、各個業(yè)務窗體Common層里有權限判斷幫助類和MD5加密類。看到Program.cs里寫著類似下面這樣啟動邏輯的基本可以確定是標準WinForm啟動流程static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); LoginForm login new LoginForm(); if (login.ShowDialog() DialogResult.OK) { Application.Run(new MainForm()); } else { Application.Exit(); } } }這段代碼的邏輯是程序啟動先彈登錄窗體登錄成功后才創(chuàng)建主窗體否則直接退出進程。注意Application.Run(new MainForm())這個寫法——主窗體不是在啟動時無腦創(chuàng)建的而是依賴登錄窗體的返回值。很多新手會把登錄窗體放在主窗體里new出來關掉登錄窗體其實只隱藏了主窗體還活著這是需要避免的寫法。STAThread特性必須保留WinForm的消息循環(huán)依賴單線程單元模型去掉會導致剪貼板和拖拽功能異常特別是后面要集成第三方SDK時必踩。3. 把項目跑通數(shù)據(jù)庫還原、連接串修改與登錄鏈路調(diào)試很多人卡在第一步不是因為代碼復雜而是數(shù)據(jù)庫沒起來。壓縮包里如果帶了.bak文件那是SQL Server的備份文件如果帶的是.sql腳本那是建表和初始數(shù)據(jù)腳本。兩種恢復方式不一樣先分清你拿到的是哪種。3.1 先還原數(shù)據(jù)庫再跑程序備份文件與腳本的差異.bak文件需要用SQL Server Management Studio的“還原數(shù)據(jù)庫”功能或者直接跑一條RESTORE命令。腳本文件則簡單得多直接在SSMS里打開執(zhí)行或者用命令行工具導入。MySQL用戶如果是拿到mysqldump導出的.sql文件命令行導入方式如下mysql -u root -p -e CREATE DATABASE PermissionDB DEFAULT CHARACTER SET utf8mb4; mysql -u root -p PermissionDB dump.sql第一行先創(chuàng)建數(shù)據(jù)庫第二行把表結構和初始數(shù)據(jù)導入進去。注意utf8mb4不能寫成utf8否則用戶表里存了生僻字或表情符號會直接報錯。導入完成后在數(shù)據(jù)庫里查一下Sys_User表有沒有數(shù)據(jù)以及Sys_RoleButton和Sys_Menu有沒有關聯(lián)記錄這兩個表如果全是空的說明腳本里沒帶初始權限數(shù)據(jù)登錄進去也看不見菜單。3.2 連接串修改App.config里的三個必調(diào)參數(shù)WinForm項目的連接字符串通常放在App.config里我見到過有人把連接串硬編碼在DAL類里結果換一臺電腦部署就要重新編譯這是反面教材。正確做法是寫在connectionStrings節(jié)點下configuration connectionStrings add namePermissionDb connectionStringServer.;DatabasePermissionDB;User Idsa;Passwordyour_password;PoolingTrue;Max Pool Size100;Connect Timeout15; providerNameSystem.Data.SqlClient / /connectionStrings appSettings add keySalt valuea1b2c3d4 / /appSettings /configurationServer.表示本機的默認SQL Server實例改成遠程機器就填IP地址加實例名比如192.168.1.10\\SQLEXPRESS。PoolingTrue和Max Pool Size100是給多用戶并發(fā)場景準備的——WinForm程序雖然不像Web那樣有高并發(fā)但幾十個客戶端同時連著同一個數(shù)據(jù)庫不開連接池就會頻繁創(chuàng)建連接表現(xiàn)為“偶爾卡一下”。Connect Timeout15是連接超時秒數(shù)默認15秒太長實際調(diào)8到10秒夠用。Salt放在appSettings里是密碼加密的加鹽值這個值一旦啟用了就不要在線上改改了所有已存用戶的密碼全部失效。3.3 登錄鏈路MD5加鹽、登錄態(tài)保持與主窗體傳參登錄窗體的核心邏輯只有三步取輸入框里的值調(diào)BLL層驗證成功則把用戶信息放進一個靜態(tài)上下文類關閉登錄窗體。下面的代碼是常見做法private void btnLogin_Click(object sender, EventArgs e) { string userName txtUserName.Text.Trim(); string password txtPassword.Text; if (userName.Length 0 || password.Length 0) { MessageBox.Show(用戶名和密碼不能為空); return; } string salt ConfigurationManager.AppSettings[Salt]; string pwdHash Md5Helper.ComputeHash(password salt); UserModel user new UserBll().Login(userName, pwdHash); if (user null) { MessageBox.Show(用戶名或密碼錯誤); return; } UserContext.Current user; this.DialogResult DialogResult.OK; }這段代碼有三個關鍵點。第一密碼做了加鹽哈希Md5Helper.ComputeHash(password salt)是把用戶輸入的原密碼拼接固定鹽值再做MD5而不是直接加密原始密碼——直接MD5查彩虹表等于脫褲子放屁。第二UserBll().Login()只返回第一個匹配的用戶如果數(shù)據(jù)庫里有重復用戶名這里會出問題所以Sys_User.UserName建表時就應該加唯一索引。第三登錄成功后把用戶對象放進UserContext.Current這個靜態(tài)屬性后續(xù)所有窗體通過UserContext.Current.UserId拿當前用戶而不是到處傳參。靜態(tài)類在這里是合理的因為一個WinForm進程里同時只有一個登錄用戶不會有多線程并發(fā)寫的問題。UserContext里一般還會順手存一份角色ID列表后面做按鈕權限判斷用得上省得每查一次權限就訪問一次數(shù)據(jù)庫。4. 把權限做細菜單動態(tài)加載、按鈕級權限與數(shù)據(jù)范圍過濾登錄跑通只是第一步。權限系統(tǒng)最見功夫的是三個細節(jié)菜單隨角色動態(tài)生成、按鈕能被控制顯隱或禁用、同一份數(shù)據(jù)不同角色看到不同的行。這三件事做扎實了這套系統(tǒng)才真正稱得上“權限管理系統(tǒng)”。4.1 菜單動態(tài)加載用數(shù)據(jù)驅(qū)動UI而不是UI驅(qū)動數(shù)據(jù)很多WinForm項目的菜單是在設計器里一個個拖出來寫死的新增一個窗體要改主窗體代碼、改菜單順序、改圖標這跟權限系統(tǒng)的理念完全相悖。正確做法是登錄后從數(shù)據(jù)庫查當前角色的可見菜單然后遞歸生成菜單項。方式比較靈活——有人用ToolStripMenuItem動態(tài)創(chuàng)建有人用TreeView控件。常見的思路是按ParentId分組然后遞歸綁定public void LoadMenus(ToolStripMenuItem rootMenu) { DataTable dt new MenuBll().GetMenusByRole(UserContext.Current.RoleIds); if (dt.Rows.Count 0) return; // 添加根菜單 DataRow[] roots dt.Select(ParentId 0); foreach (DataRow r in roots) { ToolStripMenuItem item new ToolStripMenuItem(r[MenuName].ToString()); item.Tag r[MenuKey].ToString(); rootMenu.DropDownItems.Add(item); AddChildMenus(item, int.Parse(r[MenuId].ToString()), dt); } } private void AddChildMenus(ToolStripMenuItem parent, int parentId, DataTable dt) { DataRow[] children dt.Select(ParentId parentId); foreach (DataRow r in children) { ToolStripMenuItem item new ToolStripMenuItem(r[MenuName].ToString()); item.Tag r[FormName].ToString(); item.Click MenuItem_Click; parent.DropDownItems.Add(item); AddChildMenus(item, int.Parse(r[MenuId].ToString()), dt); } } private void MenuItem_Click(object sender, EventArgs e) { ToolStripMenuItem item sender as ToolStripMenuItem; if (item.Tag null || item.Tag.ToString() ) return; // 通過反射創(chuàng)建窗體和打開子窗體 Type t Type.GetType(MyApp.UI. item.Tag.ToString()); if (t ! null) { Form f (Form)Activator.CreateInstance(t); f.MdiParent this; f.Show(); } }DATA可讀性來自于dt.Select(ParentId ...)這個篩選——它假設數(shù)據(jù)庫里已經(jīng)按SortOrder排序好了父子關系通過ParentId指向MenuId構成樹。我把Item.Tag存了兩個東西根菜單存MenuKey權限標識子菜單存FormName窗體類名通過反射動態(tài)創(chuàng)建窗體實例。這樣每新增一個業(yè)務窗體只需要在數(shù)據(jù)庫菜單表里插一行記錄并寫個窗體類代碼里完全不需要新增菜單項。注意子菜單的Tag存的是窗體類名這個類必須在UI層的命名空間下反射的Type.GetType()才能按字符串找到類型不然會在運行時報找不到類型。4.2 按鈕級權限用Tag標記加遞歸掃描實現(xiàn)WinForm沒有Web那種現(xiàn)成的按鈕授權機制要在窗體的按鈕上做權限控制就得自己掃。我是按下面這個思路做的給每個需要權限控制的按鈕Tag屬性設成權限點標識窗體加載時調(diào)用一個擴展方法遞歸掃描所有控件按Tag查權限沒有權限的直接Visible false或者禁用。代碼如下public static class PermissionExtensions { public static void ApplyButtonPermission(this Control root) { foreach (Control c in root.Controls) { if (c is Button c.Tag ! null) { string permKey c.Tag.ToString(); if (permKey.StartsWith(perm:)) { string key permKey.Substring(5); if (!UserContext.HasPermission(key)) { c.Visible false; } } } // 遞歸處理子容器Panel、GroupBox、TabPage 都是容器 if (c.HasChildren) { ApplyButtonPermission(c); } } } }這段代碼的靈魂在遞歸處理子容器。WinForm里Panel、GroupBox、TabControl的子頁都是容器控件按鈕嵌在容器里時直接遍歷頂層Controls是掃不到的必須遞歸深入每一層。我見過有人在每個窗體里寫一遍按鈕遍歷邏輯代碼重復不說漏掉Tab頁里的按鈕是常有的事。UserContext.HasPermission(key)內(nèi)部是拿當前用戶的權限集合做Contains判斷這里集合建議在登錄后一次性加載進內(nèi)存不要每次都查數(shù)據(jù)庫否則按鈕多的窗體打開會明顯卡頓。這里還有一個容易被忽略的坑如果按鈕橫跨多個Tab頁TabControl里只有當前激活的Tab頁控件會被創(chuàng)建未激活頁里的按鈕遍歷不到要在窗體Shown事件時調(diào)一次并在SelectedTabChanged時再調(diào)一次。4.3 數(shù)據(jù)范圍權限同一個查詢方法不同角色看到不同行菜單和按鈕控制的是“能不能點”數(shù)據(jù)范圍控制的是“能看哪些行”。比如訂單查詢老板要看全公司經(jīng)理看本部門員工看自己。實現(xiàn)方式通常是把數(shù)據(jù)范圍判斷下推到SQL層而不是查出結果再在內(nèi)存里過濾——內(nèi)過濾又慢又不安全繞開界面直接調(diào)BLL層一樣能拿到全量數(shù)據(jù)。我在SQL里加了一個DataScope參數(shù)存儲過程或查詢語句里根據(jù)角色設置做條件拼接SELECT o.OrderId, o.OrderNo, o.Amount, o.CreateBy, d.DeptName FROM Orders o INNER JOIN Sys_User u ON o.CreateBy u.UserId INNER JOIN Sys_Dept d ON u.DeptId d.DeptId WHERE (DataScope 1) -- 全部 OR (DataScope 2 AND u.DeptId DeptId) -- 本部門 OR (DataScope 3 AND o.CreateBy UserId) -- 僅本人數(shù)據(jù)范圍值放在角色表里用戶登錄時拿到的是他自己的所有角色的最小范圍或最大范圍這取決于業(yè)務規(guī)則——有的系統(tǒng)按最嚴的來有的按最寬的來。最常見的做法是取最小范圍也就是對用戶最安全的那個。這里要注意一點如果同一用戶的多個角色分別配置了“全部”和“僅本人”到底按哪個生效需要在產(chǎn)品層面定好規(guī)則否則就會出現(xiàn)“為什么我改了用戶的角色他看到的數(shù)據(jù)反而更多了”的困惑。參數(shù)化的WHERE條件避免了拼接SQL注入的問題但DataScope變量本身也要走參數(shù)不能直接用常量拼接進SQL。4.4 用委托和事件解耦權限變更角色改權限后不用重啟程序權限改了不生效是WinForm系統(tǒng)最尷尬的場景——管理員在權限管理窗體里給某個角色勾選了一個新按鈕權限正在使用這個角色的用戶必須重啟程序才能看到變化。這是因為登錄時權限集合已經(jīng)被靜態(tài)變量緩存住了。一個成熟的方案是用C#委托和事件做權限變更通知權限發(fā)生修改時觸發(fā)全局事件正在運行的所有窗體訂閱這個事件并重新拉取權限列表。public static class PermissionBus { public static event EventHandlerPermissionChangedEventArgs PermissionsChanged; public static void RaisePermissionChanged(int roleId) { PermissionsChanged?.Invoke(null, new PermissionChangedEventArgs(roleId)); } } // 在某個業(yè)務窗體中訂閱 protected override void OnLoad(EventArgs e) { base.OnLoad(e); PermissionBus.PermissionsChanged (s, args) { if (args.RoleId UserContext.Current.RoleId) { UserContext.RefreshPermissions(); this.ApplyButtonPermission(); // 重新掃描按鈕權限 LoadOrderList(); // 刷新當前可見的列表數(shù)據(jù) } this.BeginInvoke(new Action(() { // 更新界面上的按鈕和菜單狀態(tài) })); }; }事件里回調(diào)的代碼要特別注意線程問題如果事件是從權限管理窗體的線程里觸發(fā)的直接更新其他窗體的控件會拋“跨線程訪問控件”異常所以這里用BeginInvoke把更新動作切回UI線程執(zhí)行。如果窗體已經(jīng)關閉事件里還會訪問已釋放的控件需要在Dispose時取消訂閱。這里只展示了事件訂閱和權限刷新兩個核心動作真正實現(xiàn)時還要在權限管理窗體的“保存角色權限”按鈕里調(diào)用PermissionBus.RaisePermissionChanged(roleId)通知全局。這樣權限更新后正在使用的用戶不需要重啟當前打開的產(chǎn)品在下次操作前就會刷新按鈕狀態(tài)體驗上更接近Web系統(tǒng)。5. 從這套系統(tǒng)里踩到的5個坑及排查手法前面講的都是設計層面實際運行里還有一堆玄學問題。以下五條都是我親手踩過的按“現(xiàn)象→原因→解決”展開每條都能對應一個真實的翻車現(xiàn)場。5.1 登錄閃退密碼為空和連接串不對兩座大山現(xiàn)象是裝好數(shù)據(jù)庫、改好連接串一按登錄按鈕程序直接消失連閃退窗口都看不到。第一次遇到時會覺得是代碼Bug其實九成是數(shù)據(jù)層異常沒被捕獲程序靜默崩潰了。最常見的原因是Sys_User表里新導入的用戶密碼字段為NULL登錄時調(diào)Md5Helper.ComputeHash(password salt)直接把空值和鹽拼在一起拋了ArgumentNullException。我的修復方式是在加密前判空并且把登錄邏輯包在一層全局異常捕獲里把異常信息先寫到本地日志再彈窗string pwdHash null; if (!string.IsNullOrEmpty(password)) { pwdHash Md5Helper.ComputeHash(password salt); } try { user new UserBll().Login(userName, pwdHash ?? ); // 后續(xù)處理 } catch (SqlException ex) { LogHelper.WriteError(ex.ToString()); MessageBox.Show(登錄失敗請查看日志, 錯誤); }第二類原因是數(shù)據(jù)庫連接失敗但MessageBox被登錄界面的異常吞了排查方法是直接測試連接串能不能連通用SqlConnection打開試試。不要相信“我看連接串寫對了”實際拷到測試環(huán)境里跑一遍才是最穩(wěn)的驗證方法。另外登錄窗體F5啟動直接閃退還有一類原因是App.config編譯后沒被復制到輸出目錄ConfigurationManager.ConnectionStrings讀出來是null取值時報空引用檢查一下app.config的“復制到輸出目錄”屬性是不是“始終復制”。5.2 權限改了不生效管理員和普通用戶各執(zhí)一詞現(xiàn)象是管理員在權限管理界面給角色勾了“刪除訂單”按鈕被授權用戶反饋“界面上根本沒有這個按鈕”兩邊都重啟過開始懷疑是代碼寫錯。原因在于登錄時權限集合緩存進了UserContext的靜態(tài)數(shù)組里按鈕掃描走的是緩存數(shù)據(jù)完全不感知數(shù)據(jù)庫已經(jīng)變了。這個問題的解法就是上一章說的PermissionBus事件但要考慮一個邊緣情況如果權限管理窗體和業(yè)務窗體不在同一個進程事件跨進程是觸發(fā)不到的——同一個WinForm進程內(nèi)沒問題如果你拆了多個進程就得退而求其次在業(yè)務窗體加一個“重新加載權限”的右鍵菜單手動刷新。我自己的項目里兩種方案都做了事件負責自動刷新右鍵菜單兜底。排查這類問題最快的辦法是寫一個測試按鈕直接打印UserContext.RolePermKeys集合里的值對比數(shù)據(jù)庫里實際配置的權限點立刻能定位是緩存沒刷新還是權限點本身沒匹配上。5.3 多用戶同時操作卡死連接池占滿與事務隔離級別現(xiàn)象是十幾個人同時登錄后程序越來越慢偶爾直接報“連接池已滿”或者“事務死鎖”。這里要分兩種原因。連接池占滿是連接未釋放排查數(shù)據(jù)訪問層代碼看是否有忘記調(diào)Dispose或Close的情況。WinForm里最常見的泄漏點是DataTable作為返回值時連接被隱式保持用SqlDataAdapter.Fill()之后連接會自動關閉但很多人習慣先Open()再Fill()這個Open()的裸連接如果沒放進using里就泄漏了。死鎖則是事務隔離級別問題權限系統(tǒng)里批量更新比如給角色分配幾百個按鈕權限時先刪除再插入很容易在并發(fā)下形成鎖競爭。我的做法是給批量更新加上顯式事務并設置隔離級別為READ COMMITTED同時在連接串上配置PoolingTrue和合理的Max Pool Size。還要注意MySQL和SQL Server的事務隔離級別默認值還不一樣如果數(shù)據(jù)庫是MySQL默認REPEATABLE READ在批量插入時死鎖概率比SQL Server的READ COMMITTED高得多。5.4 WinForm界面美化和DataGridView顯示權限狀態(tài)翻車這套系統(tǒng)的界面都是原生控件客戶看到的第一反應往往是“這個系統(tǒng)怎么像Windows 98”。做界面美化要克制直接用第三方主題組件庫是個可行方向但要注意授權企業(yè)商用收費不便宜。不花錢的替代方案是把默認按鈕的邊框和背景色統(tǒng)一調(diào)整用FlatStyle配合自定義繪制這樣至少風格統(tǒng)一。另一個高頻翻車點是權限管理界面用DataGridView顯示“用戶擁有的角色列表”業(yè)務字段是0和1默認情況下顯示成一個難看的文本列。解決方案是使用DataGridViewCheckBoxColumn并設置TrueValue1和FalseValue0代碼里再配合CurrentCellDirtyStateChanged事件確保用戶點擊復選框時值能及時更新到數(shù)據(jù)源DataGridViewCheckBoxColumn col new DataGridViewCheckBoxColumn(); col.HeaderText 啟用; col.DataPropertyName IsEnabled; col.TrueValue 1; col.FalseValue 0; dataGridView1.Columns.Add(col);如果不明白TrueValue和FalseValue的作用你就會看到一個詭異現(xiàn)象數(shù)據(jù)庫里明明存的1/0界面上勾選了但保存后依然是原值或者顯示與存儲完全對不上。原因是DataGridViewCheckBoxColumn默認把true/false映射到單元格值不告訴它“1”代表“真”它就把“1”當字符串顯示出來。排錯時先看單元格的Value類型別上來就改數(shù)據(jù)庫。5.5 集成第三方SDK觸發(fā)Access Violation C0000005權限系統(tǒng)如果還要對接掃碼槍、加密狗、門禁設備或PLC上位機特別是工業(yè)現(xiàn)場桌面軟件你很可能要引第三方原生DLL?,F(xiàn)象是調(diào)用一個簽名看起來沒問題的接口程序直接崩潰Windows事件日志里寫Access Violation C0000005這個錯誤是內(nèi)存訪問違規(guī)WinForm托管代碼本身幾乎不會觸發(fā)九成是C#調(diào)用C類庫時出了問題。常見原因是DLL調(diào)用約定不匹配——C導出函數(shù)默認cdeclC#默認StdCallDllImport里要顯式指定CallingConvention。更隱蔽的原因是委托被垃圾回收把一個回調(diào)函數(shù)委托傳給原生DLL后沒保持引用原生代碼回調(diào)時托管堆上那塊內(nèi)存已經(jīng)被回收直接崩掉。排查步驟先確認DLL是32位還是64位跟程序集的目標平臺對齊再統(tǒng)一DllImport簽名把回調(diào)委托保存在靜態(tài)字段最后用DllImport聲明里的SetLastErrortrue觀察Marshal.GetLastWin32Error()的輸出把崩潰收斂成可讀的錯誤碼。6. 驗證權限系統(tǒng)是否達標5個自測動作和一個必守的編碼紀律方案落地后我每次交付前都會按固定順序做5個自測動作能過完這套流程基本說明權限系統(tǒng)沒有硬傷。第一個動作是新建一個低權限角色只給“查看”權限登錄進去確認菜單、按鈕、數(shù)據(jù)范圍三層全都受限。第二個動作是用管理員權限去反面驗證——給低權限角色加一個“刪除”權限用戶不用重啟在已打開的界面上等幾秒按F5刷新看按鈕是否出現(xiàn)。第三個是數(shù)據(jù)范圍測試建三個賬號分別掛在“全部/本部門/僅本人”的角色下查詢同一張表確認行數(shù)逐級遞減。第四個是并發(fā)測試兩個客戶端同時修改同一個角色的權限配置確認不會出現(xiàn)死鎖或者保存后互相覆蓋。最后一個是日志檢查在數(shù)據(jù)庫操作日志里看每個權限點變更都能追溯到操作人和時間戳沒有日志的權限系統(tǒng)等于沒做審計。這個流程走完再補一個我從項目里學到的紀律所有權限判斷只能出現(xiàn)在一個地方——封裝成HasPermission(string key)方法任何窗體不允許出現(xiàn)if (UserContext.Current.RoleId 1)這類代碼。因為“RoleId等于1”是硬編碼它假設了數(shù)據(jù)庫里ID為1的角色永遠是管理員但這個假設在產(chǎn)品維護期大概率會被打破。我接手過一套系統(tǒng)到處是這種判斷后來客戶要求把“超級管理員”改成角色名是“系統(tǒng)管理員”的另一個角色翻遍代碼改了三天。用HasPermission方法統(tǒng)一判斷權限變更只影響數(shù)據(jù)庫配置代碼零改動。WinForm權限管理系統(tǒng)的價值在于交付后不用頻繁發(fā)版角色和權限的調(diào)整全部收斂到數(shù)據(jù)庫里這對維護期的團隊來說就是最大的省心。希望這篇能幫你少走一些我走過的彎路。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩不卡a级视频专区| 亚洲男人综合| 久久国产三区| 欧亚乱色熟女一区二区| 成人羞羞视频国产| 欧美日韩狠狠爱| 成人日韩中文字幕| 国产超碰国产97| 亚洲国产一级精品毛一级精品看免费视频| 福利视频香蕉免费一区二区在线| 久久精品超碰| 无码九九| 91大香蕉伊人| 欧美激情亚洲| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 久久亚洲不卡| 国产精品午夜高潮呻吟久久av| 蜜臀无码视频在线观看| 日本孕妇一区二区视频操逼免费看 | 黑人性欧美| 亚州乱码中文字幕综合久久久| 99热只有这里有精品| 强奸乱伦 亚洲一区| 九月伊人中文字幕| 欧洲视频在线| 青青在线视频日韩欧美| 上特色A在线| 久操电影网| 97天天在线| 色五月69夫妻| 狠综合网| 搞中出视频在线观看| 97久久久久久久精| 中文字幕伊人| 色妇91| 啊啊啊啊操死我了| 九九久精品| 欧美91色| 欧美线天码中字| 91狠狠狠| 久久粉色| 久久久精精精| 99re免费| 国产又猛又粗又爽又黄| 中文字幕一区二区韩| 亚洲人妻中文高清| 天堂8在线新版官网| 久久五月天婷婷| 东京日日夜夜| 久久久久久久少妇| 中文字幕熟女人妻丝袜丝| 伊人嫩草| 懂色Av| 欧美性爱日韩高清| 人人操人人操草草| 五月婷婷啪啪| 麻豆 欧美 日韩| 一区中文字幕二区日韩| 亚洲熟妇综合久久久久久| 色偷偷综合91久久噜噜| 无码粉嫩白虎一线天b区| 国产精品操| 女人天堂av在线播放| 国产在线综合网| 操逼片国产| 亚洲精品啪视频| 手机看片1024你懂的国产| 亚洲永久永久永久永久一级一级一级精品 | 蜜臀久久99精品久久久久久无删减 | 91狠狠综合久久久| 亚洲精品亚洲人成在线麻豆| 亚洲国产第一页综合视频| 色五月婷婷麻豆在| 加勒比综合九九99视频在线播放| 欧美九一精品久久久熟妇| 亚洲 欧美 日韩另类 麻豆| 欧州91高潮| 制服丝袜第二页| 狠色婷婷久久一区二区三区_| 天天综合网91入口| 国产精品动态一区二区三区四四| 亚洲男人天堂网| 大香蕉视频一二三区| 色色色欧美| 91爱综合| 大香蕉2017| 国产又黄又粗又猛大片| 911粉嫩人妻| 美女啊啊啊啊啊啊啊| 伊人一区二区三区| 五月亭亭六月丁香| 国产精品久久发布| 久久国产精品m码| 精品久久久高清无码| 岛国精品视频在线观看| 怡红院成人av| 欧美精品久久96人妻无码| 美國A片| 视频国产成人精品日本亚洲18| 国产熟女无套内射| 日韩丰满熟妇| 熟女欧美日韩综合婷婷| 国产无码久久高清| 啊啊啊操一区| 欧美成97爱| 国模艳艳啪啪一区| 欧美97视频| 亚洲av综合色区图片亚洲| 97久久国产精品女不卡| 国产精品爽爽va在线观看98| 97超碰色中文字幕| 天堂а√在线最新版在线| 欧美大码在线视频| 97欧美超碰| 丁香五月大香蕉| 人人摸人人舔一区二区| 强奸xx国产| 亚洲的天堂网| 亚洲欧美日韩精品久久久一区二区| 999久久久九| 日本 情色 1区| 欧美久久伊人| 国产农村妇女精品1区二区| 日日干男人的天堂| gogogo免费高清看中国国语| 大香蕉色网| 男女猛烈无遮掩视频免费软件| 操少妇很爽av| 黑人精品XXX一区一二区| 桃色六月天| 日韩国产精品人妻无码久久久| 99啪啪| 啊啊啊男女| JULIA一区二区三区在线播放| 色哟哟av网址| 制服乱伦| 日韩欧美中文| 国产最火爆久久国产网站网站| 少妇国产不卡| 在线强奷到舒服的无码视频| 97国产中文| 99久在线精品99re8| 91日韩网站| 在线 制服丝袜中出 人妻| 天天干人人乐| 欧美第38页| 人妻中文字幕精品无码| 干b网| 色婷婷丁香五月| 91精品网站| 色情综合网| 精品少妇999| 蜜桃精品一区二区三区ww | 豆花视频操逼网址| 97爱碰| 亚洲色五月| 精品无码久久久久久久久果冻糖心| 好湿好紧好爽 视频| 立川理惠被中出无码 | 日韩性爱人人爱人人操| 老熟乱一区二区三区四区| 亚州伊人色综台| 爱妃国产亚洲视频中文字幕| 丝袜色综合| 丰满人妻一区二区三区| 欧美午夜视频免费观看| 天天性射网| 色九月综合| 日本福利二区视频| 一区二区三区亚洲| 97 色综合| 91精品丝袜在线观看| 久欲AV| 免费观看啪视频| av中亚| 欧美大色交| 蜜臀久久99精品久久久久久久久| 一区二区三区免费岛国片| 阿姨一区二区免费视频-高清正片西瓜视频下载app-T450AV | 人妻 丝袜美腿 中文字幕| 亚洲自拍小说| 日韩视频小说在线观看| 91在线美女| 在线看免费无码AV天堂的| 亚洲学生妹高清av| 欧美性性性| 美女丝袜激情小说| 亚洲成人妻日韩在线| 嗯嗯啊啊视频在线看| 探花熟女,姿勢到位,體驗感也到位| juliaann欧美丝袜办公室| 天天看高清麻豆| 天天天肏屄欧美| 国产乱码久久| 96AV久久久| 玖玖97综合 | 国产狂喷潮在线精品| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 精品无码一区二区三区| 亚洲成a人v欧美综合天堂下载| 91影视亚洲| 日韩激情视频| 亚洲黄色网址| 精品久久久不卡一区二区| 一本正道久久熟女| 久久婷婷亚洲欧| JULIA人妻风俗店中出电影| 夜夜草网站| 97欧美日韩| 人伦四五区| 呦女网站| 2020中文字幕在线| 欧美色91| 黑人精品XXX一区一二区| 欧美日韩久久精品爱爱| 不卡日本一区二区| 中文一区二区三区影院| 欧亚性爱在线视频| 高清成年美女黄网站免费大全 | 涩综合导航| 国产一区二区在线播放量| 大香蕉一级黄色片久久| 国产亚洲美日韩Aⅴ中文字幕无码成人| 国产精品福利视频播放| 色翁荡息又大又硬又粗又爽| 国产男女无套视频免费观看| 久操婷婷| 中文字幕视频一区视频二区| 综合网亚| 亚洲国产福利视频| 欧美色另类| 色色毛片| 老熟女乱子伦中文字幕一区二区| 久久激情亚洲精品无码?V| 秋霞免费AV| 色综合色欲色综合色综合色综合| 欧美日不卡| 精品久久久久瑟瑟| 日韩八十路老熟女| 97国产超碰| 97爱爱爱| 91黑丝操| 男人的天堂三级| 四虎免费在线播放| 精品高潮| 国模精品一区二区三区苹果色戒| 六九九九| 自拍第一页| 熟女人妻一区二区三区| 久久日韩精品一区二区| 99精品成人免费看| 2025亚洲男人天堂| 精品久操| 日本韩国国产精品一区| 日韩草久视频| 九久久精品| 美女91AV| 热九九精品| 久久久久久久久久久人妻| 黑人与人妻| 男人的天堂VA| 日韩国产欧美伦理在线| 蜜臀久久99精品久久久久久久久| 校园春色宗合网| 96精品久久| 日本免费中文字幕在线| 久久久com| 玖玖爱综合网| 青青免费在线视频一区| 狠插 制服 自拍| 人妻精品一区二区| 国产成人免费观看在线视频| 欧美日韩资源在线| 97伊人网| 久久草大香蕉| 亚洲中文丝袜美腿诱惑字幕| 日韩精品人妻一| 蜜桃精品一区二区三区ww| 亚洲天堂少妇| 新婚人妻扶着粗大强行坐下| 欧美精品三区| 亚洲成人av电影在线| 麻豆国产原创AV色哟哟| 天天网综合| 久热九九| 亚洲九九视频| 国产激情av女片自拍| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 岛园激情| 97少妇人妻中文字幕久久| 国产乱伦性爱区| 人妻无码后入| 久艾草在线精品视频在线观看| 女人天堂AV五区在线| 女生看匆91网站| 国产女人成人精品视频| 欧美亚洲清纯| 免费毛片在线播放| 96精品久久久| 日本综合久久| 大色综合| 成人AV素股で擦久久| 久久久四区| 五月丁香六月激情综合| 欧美成人精品欧美一级乱黄一区二… | 青草青青久久久久久国产| 在线欧美亚洲| 欧美三级免费伊人| 手机午夜电影神马久久| 99最新日韩偷拍视频| 在线观看不卡一区二区三区| 亚州AV无码国产精品| 久久99精品九九久久久婷婷| 天天干夜夜一操| 九九av| 亚洲精品中文字幕一区在线视频| 欧美亚洲清纯| 日本久久久久久久久| aa片毛片| 日本美女性生活久久久久久久| 中文字幕免费看| 久久久久九九九| 2019男人的天堂| 99热国产| 豆花视频操逼网址| 91精品又粗又猛又爽| 动漫爆乳3D奶水一区在线观看| 91精品91久久久久77777| 深爱五月天| 中文字幕在线观看网址| 东北女人的毛片| 免费精品人妻一区二区三| 综合一区二区影视| www.狠狠干.coom| 日本潮催一卡操| 国产视频小说| 99这里只有精品| 香蕉国产精品麻豆亚洲欧美日韩| 色偷偷人人玩人人舔人人操人人摸人人爽| 亚洲夜夜欢无码一区二区| 综合第一页| 欧美91精彩| 99久久久久| 欧美性爱无码一区二区三区| 99少妇| 久久超碰、| 精品国产乱码久久久久久口爆网站| 欧美色蜜桃97| 青青欧洲黑| 大香蕉啪啪啪| 91视频精品| 久久同城AV| 五月天开心网| 日韩精品视频在线观看一卡二卡| 国产综合色精品在线观看| 少妇三P| 日韩精品国产精品五码一区二区| 日韩欧美aⅴ综合网站发布| 蜜臀99精品国产高清在线观看| 99色婷婷中文字幕乱色| 东京日日夜夜| 色官网在线| 中文人妻av高清一区| 国产精品一区二区密臀| 超碰这里有精品| 今日头条成人一区二区三区四虎精品| 麻豆亚洲Av成人无码一区精品| 无码人妻丰满热妇又大又粗| 无码人妻一区二区三区色欲aⅴ| 欧美,日韩,中文,另类| 99xav| 日本一区二区电影网站| 亚洲丝袜二区| 伊人五月天| 欧美国产伊人久久久久| 999岛国大片| 视频在线观看免费一区二区三区| 懂色中文一区二区三区| 国产精品人妻无码久久久互動交流 | 深田咏美亚洲精品福利社| 亚洲乱色熟女一区| 欧美色www亚洲国产阿娇要播| 91大香蕉伊人| 色欧美色交综合| 91精品人妻五十路| 国产日韩怡红院| 国产又粗又长的视频| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 96超碰网| 超碰九7免费| 九九九国产| 国产一区二区三区久久久精品| 久久久久久久极品香蕉视频| 婷婷久久综合久| 国模少妇一区二区三区| 日韩操人| 热久久91婷婷| 射欧美综合| 久久久久一本一区二区青青蜜月| 97精品熟女少妇一区| 麻豆天美国美国产| 美女露胸露尿口| 在现视频女上位好爽| 操人妻少妇中文 | caopeng97| 伊人久久大香蕉线AV五月天| 亚洲综合九| 学生妹天天看| 好爽免费视频| 在线观看不卡一区二区三区| 国产高清免费不卡av| 萌白酱自拍视频| 日韩国产中文字幕| 亚洲另类久操网| 99re95| 精品视频一区二区| 色哟哟511老熟女| 日日摸日日弄日日拍| 亚洲久草AV色图| 欧美中日韩XXXX| 91欧美美女日韩国产婷婷| 99热超碰| 好爽要喷了| 欧美日韩精品久久久久久久久东北老熟妇| 精品国产一区探花在线观看| 亚洲乱码尤物193YW| 日本91白丝| 97超碰在线资源网站| 久久老熟女| 中文字幕乱码人妻二区三区| 激情五月综合| 亚洲男人天堂2| 亚洲毛片基地专区| 97国产高清视频在线观看| 天无日色综合| 视频在线97| 桃花色综合影院| 2020国产精品| 美女黑人91神马| 超碰在线一区二区| www.人人cao| 日夜久久久九九九久| 亚州高清AV| 国产乱伦性爱区| 天天日天天舔天天喷天天射| 日韩精品一区,二区 九九...老司机| 夫妻天天操岛国视频| AV无码久久久精品| 蜜桃视频一区二区三区在线观看| 热热色中文无码| 久久久久亚洲Aⅴ无码| 中文久久一区| 亚洲高清视频在线免费观看| 综合熟女| 亚洲九九视频| 午夜高清成人在线视频| 2019午夜福利视频| 99国产精品视频尤物| 日本天天人人狠狠在线日美女| nuu12国产麻豆精品| 狠狠中文字幕| 亚洲熟女一区| 久久青青草原免费视频| 日韩精品99999| 久久久久久久六六| 很黄很色的视频在线观看| 免费看毛片操穴| 久草毛片| 久操精品网| 9999九九九久久久| 精品欧美А∨无码黑人大荫蒂| 人妻插插人妻人| 欧美性夜| 欧美一区二区亚洲天堂| 日本一卡二区在线| 色爱三区| 91欧美情色| 日韩av影片在线观看| 97视频在| 国产精品久久99日日| 夜夜高潮夜夜爽| 天天干18禁| 日本有码久久| 97天天摸天天爽| 丁香色色网| 97超碰9| 五月天婷婷基地| 亚洲激情久久久伊人综合| 69精品人人人人| 欧美日韩小说| 久热九九| 97色碰| 精品免费一区二区三区在线亚洲人成| 91精品91久久久久77777俄罗斯老妇姓x| 超踫中文字幕| 78久久| 九一亚洲国产免费| 国产高清在线观看欧美| 99热日| 天天干天天操天天干天天操| 91精品国产91熟女| 蜜臀久久99精品久久综合| 97天堂| 精品九九淫乱男| 国产中文字幕曰本毛片| 蜜臀va69| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 人人人干干人人干| 久久五月丁香| 少妇熟女一区二区三区| 亚洲精品乱码久久久久久蜜桃麻豆 | 日韩中文字幕宗合在线| 尤物黄色在线观看网站| 亚洲麻豆精品二区三区| 高清无码学生妹高潮| 欧美日本成人一区二区| 九九综合| 好涩综合| 亚洲伊人久久精品狠狠在线| 综合 亚洲 欧美| 高清在线不卡一区二区 视频| 97色色视频| 啊啊啊啊好疼视频| 中国国产精品一区视频| 91暧暧| 一区二区偷拍拍视频| 久9精品| 一品道视频一区二区三区| 久久久久久久强迫| 精品一区99999| 伊人天堂在线| www..com操老师| 99无码| 久久草视频污视频| 乱精品一区字幕二区| 蜜乳性色无码专日粉嫩骚逼AV| 五月天AV资源| 青青草精品| 99热97| aaaa少妇高潮大片| 翔田千里AV无码秘 三区| 欧美丝袜亚洲| 欧美91精彩| 17c在线成人免费A片观看| 久草在线| 亚洲欧美激情小说| 加勒比海成人视频网| http://qxhbdz.com| 成人性爱高清视频免费看| 啊啊啊啊好疼| 久久婷婷一区| 大乔未久88一区| 99性爱| 亚洲第一狼人丝袜美女另类 | 午夜在线播放| 激情四射婷婷六月天| 99啪啪视频| 91狠婷| 韩国一级婬片A片AAAAA| 久久综合国产精品国产| 三级激情网站| 1769国内精品视频| 欧美丝袜中文字幕07在线| 后入式五六区| 大屁股熟女一区二区三区| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 日本一区二区不卡精品| 亚洲国产婷婷在线播放| 日韩熟女操逼| 麻豆精品.欧美精品.日韩精品.| 色偷偷超碰亚洲| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 久久99干一本高清| 久久成人精品| 久欲AV| 韩日欧亚a级| 丰满欧美放荡少妇在线| 欧美性Fer办公室秘书| 密臀成人视频久久久| 中出后入| 凌辱美少妇久久aV| 啊啊啊好想要| 91欧洲国产成人久久精品网站| 亚洲无992tv| 97在线视频网站| 无码78| 国产一区二区二区按摩精品啪视频| 天天日天天操天天射河南省| 国产无码三级视频在线观看| 国产兽交视频在线播放| 国产尤物AV尤物在线观看不卡| 人妻中文字幕日韩电影| 丁香五月激情综合国产| 亚洲熟女国产综合另类| 日韩超碰精品综合| rivers-china.com| 大香蕉伊人75| 欧美Ⅴ性爱| 日本国产高清色www视频在线| 国产一区在线免费播放| 九月色婷婷| 青青操少妇| 激情四射婷婷六月天| 亚洲欧美电影| 中文字幕一区二区日韩网| 大香蕉专区| 天天狠| 久久久久9999妇女| 久草老司机| 尤物av网站免费在线播放| 无码区蜜乳| 国产黄色在线播放观看| 日韩精品在线观看网站| 色一射色一射| 国产AV线| 国产日韩欧美中文在线播放| 99久re热视频精品98| 色色色五月婷婷| wwe 天天干.com| 国产熟女高潮一区二区三区| 操国产高清| 国产大学生高潮在线播放| 亚洲AV无码| 国产女主播视频在线观看| 欧美性爱第一页久久| 人人考人人摸人人干| 92福利社视频| 青青草综合在线| 精品丝袜无码一区二区三APP| 九九九九九九九精品视频| 99∨VTV| 男人把坤坤插入女人的下体| 国产自偷| 狠狠久久四虎| 吊色| 色综合av男人天堂| 国产一区二区三区不卡手机在线| 91高清欧美| www.伪伪| 亚洲棕合电彰| 一级性爱视频免费观看 | 干b在线性社区| 日韩欧视频| 99热自拍| 日本高清一本二本免费不卡| 少妇厨房愉情理伦片bd在线观看| 91女在线观看| 久久这里只有精品9| 粉嫩av在线一区二区| 99热导航| 欧美黄色大片在线观看 | 99视频内射三四| 尤物视频偷拍免费| 欧美人体性爱互联网第一页婷婷日本| 99这里只有精品| 久久久免费视频18| 日人妻视频91| 97国产精品久久久久| 国产精品嫩草久久久久| 久久草视频污视频| 日本免费中文字幕在线| 亚洲青青草| 欧美性爱视频免费一区一A| 天堂射| 在线观看国产黄色| 亚洲交换| 久久极品一区二区| 九热中文字幕| 久久a久久| 8x福利精品第一福利视频导航| 欧美午夜色妇色鬼| 乱论91| 91N综合网在线| 色色五月天激情| 日本黄色精品| 青青网三级视频| 91P0RNY大屁股人妻| 老师充足的奶水小说| 干干干天天| 狠狠爱夜夜干| 欧美婷婷五月天| 91夜色| 97人人爱人人做人人乐| 国产亚洲日韩在线三区黑人| 欧美激情黑人| 日韩人妻精品久久久久| 情趣丝袜无码操逼视频| 欧美熟妇亚洲版| 久久99精品视频| 色牛aV| 熟妇亚洲一区二区三区| 91丨九色丨国产丨人妻在线| 亚洲人久久久网| 俺去也婷婷| 亚洲欧美国产va在线播放频| 爱丝福利| 欧美日韩99精品麻豆传媒| 2023天天操夜夜操| 欧美丝袜亚洲| 97se综合网| 国产久久久久久久久一区二区 | 在线色导航| 91观看 国产白丝| 嗯嗯啊啊用力视频免费| 久久精品中文字幕观看| 久久香蕉国产线看观看亚洲女人 | 97超碰日韩| 91在线/欧洲| 香蕉综合网| blacked精品一区国产| 东京太热男人的天堂久久久| 蜜桃中文字日产乱幕4区| 一起草精品人妻| 亚洲婷婷丁香在线| 超碰导航97| 2019AV天堂| 久久一区二区高清免费| 三男一女不戴套的A片| 天天综合站| 日韩精品99久久久久久中文字幕| 精品国产肉丝袜在线拍国语| 一区二区三区四区免费视频| 91精品国产91综合久久蜜臀| 91热色| 香蕉免费一区二区三区不读 | 亚洲午夜AV| 亚洲 一区二区 自拍| 欧美天天性| 97超碰超| 伊人在线大香蕉二。| 日韩av熟女一区二区三区成人| 五月丁香啪啪网| 国产www色在线观看| 天天狠操| 人妻性爱一区二区| 九九九免费视频| 色欧美在线| 久久人妻一区二区三区高清| 激情综合网一盗摄| 亚洲永久永久永久永久一级一级一级精品| 素人美腿视频网站| 思思热在线| 丝袜美腿诱惑亚洲欧美视频在线观看| 在线综合色| 乱伦强奸区日韩| 色欲Av人妻精品一区二| 亚洲情色视频| 久久青青草在线视频| 九九九九一区| 天天综合青苹果| 国产视频97| 久久成人网站| 六九九九| 亚熟在线| 五月天伊人| 超碰538| 91日产欧美| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 加勒比在线视频一区二区三区| 偷拍 欧美 日韩| 日韩 国产 欧美自拍| 亚洲欧美日韩中文播放| 免费αV在线视频| 综合激情二| 久久亚洲欧美中文字幕国语| 午夜理论片在线观看免费| 亚洲AV操| 大奶啊啊好爽 | 97中文综合| 男人的天堂Va| 九久9精品| 成人无码在线视频网站| 午夜.DJ高清在线观看免费7| 国产高清精品一区二区三区毛片| 亚洲另类春色| 粉嫩av在线| www.99中文字幕| 久久久 国产精品| 九色 人妻 大香蕉| 亚洲三级网址久久最新| 干美女人妻| v91av| 日韩av在线精品观看| 久久精品中文字幕无码l| 日本精品成人无码| 91伊人大香蕉| 91欧美巨乳| 超碰色综合| 在线无码视频| AV 少妇 人妻 偷拍| 啊嗯好大视频在线观看| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 日韩九区| 美腿色图| 蜜桃久久一区| 蜜乳中文字幕a在线| 超碰91在线| 蜜桃久久久久久久| 91操熟女视频| 老司机深夜18禁污污网站| 精品人人插人人操| 一区麻豆 高清中文字幕| 久久精品导航| 岛国在线免费视频| 亚洲九区| 国产熟女精品区| 4虎在线视频| 亚洲AV麻豆Aⅴ无码电影一 | 久久综合激情| 蜜臀久久在线视频| 天躁夜夜躁2021| 国产在线观看91精品一区| 婷婷爱五月| 久日综合网| 精品久久无码午夜福利| 色狠狠 - 百度| 五月黑AⅤ| 中文字幕少妇色| 精品少妇一区二区三区| 亚洲春色欧美激情自拍| 密乳无码| 99www.bibizy香蕉资源国产一区二区三区高清| 久草色在线观看| 国产欧美岛国精品一区| 91精品人| 精品国产久热在线观看| 色爱欲亚洲| 曰韩人妻中文字幕在线| 色婷婷久久| 亚春色色| Blackedraw视频一区二区| 国产a级精品| 男人的天堂久久久| 久久久国产三级黄色片| 色偷偷综合91久久噜噜| 嫩呦国产一区二区三区AV| 中文字幕少妇色 | 伊人991| 免费人成毛片乱码| 国产suv精品一区二区四区999| 久久久一二三四区| 超碰99热| 爱干爱射网啊啊啊| 99热国产| 亚洲精品乱码久久久久久蜜桃麻豆| 男人天堂日日夜夜| 乱伦一区二区三区‘| 东京热一区二区三区四区五区六区| 91精品国产91综合久久蜜臀| 91 刺激在线| 天天综合网在线观看| 亚洲综合成人网| 国产精品一区二区三区四区五区| 九热视频| 搡老女人老熟女91| 日韩性色b| 一个色导综合| 欧美72网页| 黄片com.| 校园春色欧美| 性爱综合网| 日本精品五区| 四虎免费看黄| 欧美精品一区二区少妇免费A片| 久久久久9999精品九九九| 日韩亚洲精品一区二区| 女人18精品一区二区三区| 日本日皮视频逼| 美欧色综合| 男女打扑克高清网站| 免费?级毛片无码?∨蜜芽试看| 69精品人人人人| 国产三级日产三级韩国三级| 日本久久久久久久久久| 日韩欧美麻豆大片| 秋霞一级鲁丝片A片| 日产成人久久| 狠狠色色| 亚川综合视频| 日日嗷| 久久色一区| 变态乱伦伪娘灌肠一区二区| 强乱老妇中文字幕| 成视频在线观看免费看| 亚洲一区日韩精品中文字幕| 久久熟女人| 家庭乱伦性爱av| 国产精品一级二级在线| 久操综合在线| 亚洲麻豆av一区二区| 风骚少妇视频中文字幕| 黄色电影在线播放综合网站| 无码二级三级| 色播五月丁香| 综合久久久久久久综合网| 国产一区二区久久| 翘臀vidoes| JIZZJIZZ亚洲女人被躁| 中文字幕av片| 成人在线日韩| 99在线无码精品秘 入口黑人| 少妇久久久久久久久| laoshunv91| 九九热精品免费视频| 欧美日韩不卡a片| 99色网| 久久机热| 欧美综合在线91| 久久国产视频性吧 | 国产兽交视频在线播放| 超碰9 7女人| 亚洲综合性网址| 精品久久久久久亚洲| 熟女字幕| 人妻色偷色噜| 97超碰美女| 亚州Av天美传媒| 美性中文综合网| 亚洲AV无码天美传媒一区| 9999免费精彩视频| 6080YYY午夜理论片在线观看| 91美女视频在线观看| 国产精品久久久久久9999| 九九热视频这里只有精品| 伊人久久婷婷| 欧美日韩性爱视屏免费看了| 大香蕉综合网| 久久久久久九九九九九| 久久熟女精品不卡一区| 欧美亚洲涩涩| 熟女AV一区| 黄色二级片网站| 国产伊人自拍| 97操碰| 色五月婷婷在线| 人人操,操人人| 美女国产一区二区久久| 精品人妻1区| 为用户提供免费看黄网址在线观看| 亚洲图片91| 人妻天堂网| av 模特一区了| 国产欧洲精品亚洲午夜拍精品| 偷拍色图| 一区二区国产视频在线观看| 亚洲黄色网址| 97青娱乐超碰久久| 中文字幕乱码人妻一区二区三区,99精品| 欧美拳交在线播放| 日本天天吊| 九九九热精品| 久久九操在线观看| 五月天久久婷婷亚洲| 91狠狠综合久久| 家庭乱伦性爱av| 无码天天操| 国产精品宅男免费| 五月丁香社区婷婷日韩欧美精品影院| 国产树林里野战在线看| 亚洲高清欧美总合| 91N综合网| 欧美色老汉| 精品人妻一区二区免费蜜桃视频| 高潮9999外国| 另类图片综合| 久久AV无码AV| 少妇一级婬片免费放一级a性色.| 美女9118禁| 中文字幕天堂在线| 污污汅18禁网站在线永久免费观看| 福利操逼| 99自拍视频在线| 亚洲五月丁香花狠狠干一区二区三区| 炮色五月| 欧美暴力猛交| 国产精品另类| 九热久| av一区二区三区不卡| 九九热三级片| 中文字幕,人妻,日韩| 韩国一级做A片免费的| 97五月天| 欧美青青视频| 亚洲色天堂九9| 国产黄色剧情影片麻豆免费播放| 日本色色视频网站| 成片免费播放| 中文字幕第页| 91撸色网 玖玖网 欧美| 91天堂丝袜美腿| 夜色91| 亚洲中文日韩精品| 丁香五月婷婷五月| 中文字幕乱碼在线| 97草草| 黄色香蕉视频网站一区| 强奸乱伦亚洲第一页| 久久久久久久久久8888| 熟女欧美日韩综合婷婷| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 熟女欧美日韩综合婷婷| 97少妇人妻中文字幕久久| 亚洲啪啪综合?v一区综合精品区| 免费自拍三级综合| 91N欧美| 久久久久9999精品九九九| 大奶的诱惑| ..日韩av毛片精品久久久| 亚州操操穴网| 国内毛片四区| 超碰色男人操熟女| 亚洲骚女一区二区三区| 中文字幕久久亚州无码| 亚洲黄片免费在线播放| 成年人黄色小视频网站| 乱理日韩中文| 夜夜欢天天干| 玖玖资源综合在线视频| 香港日本韩国人妇99www.wccm20| 欧美96在线|欧| 亚洲精品亚洲人成在线麻豆| 屌逼传媒| 91精品国产91熟女| 国模精品一区二区三区苹果色戒 | 75大香蕉| 亚洲成a人v欧美综合天堂下载 | 欧美日韩亚洲电影| 高清孕妇孕交 交| 五月婷婷激情综合| 成人片视频| 国产毛片久久久久久久| 亚洲丝袜色图| 97视频免费在线观看| 九九热精品视频在线观看| 一本色道久久综合熟妇| 国产黄片在线免费观看| 久久超碰大香蕉| 国产中出内射一区二区| 无码一区二区三区四区五区六区七区八区九区十区视频 | 国产超碰| 丰满人妻一区二区三区在线| 天天肏视频| 天天91~综合入口| 91无码人妻精品一区二区三区蜜桃| 久久久久国产精品喷潮免费观看臀 | 亚洲欧美日韩激情不卡| 日本 欧美 亚中文字幕| 99re这里只有精品9| 婷婷五月天色| 亚洲欧美另类图片| 亚洲少妇色| 张柏芝国产一区在线观看| 玖玖爱综合| 欧美在线播放| 四季AV综合网址| 富女玩鸭子一级毛片| 亚洲人妻熟妇三十三区| 一级片在线观看高清无码| 日韩人妻无码精品系列| 巨爆乳一区二区爆乳区| 性性久久| 欧美亚洲日本激情在线| 天天爱天天操| 开心激情婷婷| 午夜小电影在线插入淫高潮| 精品国产少妇高潮视频| 日韩精品在线放| 国外91| 在线观看综合精品亚洲| 日本媚薬中文字幕在线| 色性综合| 高潮毛片无遮挡高清免费| 久久久神马影院| 免费看久久久性性| 91美女小视频| 久久亚洲影院一区二区| 国产一区二区三三视频| 日本亚欧爱爱| 99色热| 久久国产熟女影院| 台湾佬中文娱乐网久久久久久久久久com | 国产日韩欧美亚洲精品95| 亚洲猛交| 精品国产乱码久久久久久久久1| 黄片免费视频2019| 女人18精品一区二区三区| 五月天色图| 另类TS人妖一区二区三区| 色网综合网| 久久精品人体| 国产69精品久久久久99尤物| 五月婷婷激情网| 不卡视频一区蜜桃视频| 精品97久久| 欲香欲色综合天天伊人| 亚洲AV色图一区| 久久中文字幕人妻熟av女蜜柚| 裸体美女久久久| 亚洲综合射| 婷婷精品久久av影视| 91视频综合在线| 天天拍天| 亚洲男人天堂网| 美女91网站| 桃花色涩综合影院| 玖玖视频在线资源一区二区三区| 91九九九小逼| 免费啪啪av| 99re这里只有精品中心播放 | 日日日啊啊啊| 久久岛国| 亚洲制服欧美另类内射| 婷婷综合五月| 香蕉免费一区二区三区不读| 亚洲**2021在线观看| 很很热性爱视频| oumeizonghese,www| 国产精品嫩草影院午夜两性| 天天操女人| 男人午夜天堂| 中文字幕在线24| 九色黄站| 激情看片网站| 亚洲春色欧美| 欧美很很操视频| 亚洲中文sv| 九九精品热| 亚洲激情视频| 欧美日韩国产传媒在线精品| 一级毛片电影免费看| 91色爽欧美| 大地资源在线观看中文第二页| 蜜臀av中文字幕| 黄片在线免费在线观看| 熟妇女伦乱视频视频| 丁香六月啪啪| 在线观看成人性爱免费小视频| 男人的天堂在线| 狠狠干,狠狠操| 美国日韩黄片| 久久精品无码不卡| 午夜天堂精品久久久久91| 亚洲视频精选| 久草精品一区| 久久人妻视频网| 无码高清专| 欧美巨大性舒爽顶到了| 亚洲综合色图欧美| 激情五月综合网| 97超碰色中文字幕| 熟女天天干| 亚洲欧美国产成人综合不卡| 欧美性性性| 久久国色天香香蕉| 久久亚洲一区女同性恋中文字幕| 手机在线人成免费视频| 天天干天天日天天射黄色片| se01国产在线视频| 人妻熟女一区二区三区在线| 国产精品乱码久久久久久|