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

ARTICLE DETAIL

資訊詳情

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

Winform用戶權(quán)限模塊設(shè)計(jì):RBAC模型與Dapper實(shí)踐

Winform用戶權(quán)限模塊設(shè)計(jì):RBAC模型與Dapper實(shí)踐 簡(jiǎn)介面向C# Winform開(kāi)發(fā)者的用戶管理功能完整示例以MySQL為數(shù)據(jù)底座覆蓋用戶創(chuàng)建、角色創(chuàng)建、用戶日志記錄、操作權(quán)限設(shè)置四大模塊適合課程設(shè)計(jì)或企業(yè)后臺(tái)賬號(hào)體系開(kāi)發(fā)時(shí)初學(xué)與參考。壓縮包共49個(gè)文件、約957KB以.cs源碼、.resx窗體資源、.sln/.csproj項(xiàng)目配置為主體另附可運(yùn)行exe、依賴dll以及.sql數(shù)據(jù)庫(kù)腳本打開(kāi)解決方案即可運(yùn)行調(diào)試適合通過(guò)實(shí)例理解項(xiàng)目結(jié)構(gòu)。工程內(nèi)包含DalMySQL、DbExtension、Bll等分層數(shù)據(jù)訪問(wèn)與業(yè)務(wù)處理代碼以及用戶注冊(cè)、登錄、角色分配、權(quán)限校驗(yàn)、日志記錄等窗體邏輯數(shù)據(jù)庫(kù)腳本提供用戶表、角色表、權(quán)限表及關(guān)聯(lián)表的建表語(yǔ)句可直觀學(xué)習(xí)ADO.NET連接MySQL、密碼加密存儲(chǔ)、RBAC權(quán)限檢查等落地寫法。已有374人學(xué)習(xí)下載對(duì)想快速掌握WinformMySQL用戶權(quán)限管理寫法的開(kāi)發(fā)者具有較高參考價(jià)值也可為后續(xù)擴(kuò)展操作審計(jì)、菜單權(quán)限等功能提供基礎(chǔ)。1. 用戶模塊看著簡(jiǎn)單為什么Winform項(xiàng)目里最容易返工做過(guò)內(nèi)部管理系統(tǒng)、MES上位機(jī)的Winform開(kāi)發(fā)者應(yīng)該都有同感用戶創(chuàng)建、角色分配、操作權(quán)限設(shè)置這些功能單看每個(gè)都不難但湊到一起就成了返工重災(zāi)區(qū)。原因在于需求總在變——上線第一版只要一個(gè)登錄框第二版客戶就要分管理員和操作員第三版又要求“操作員不能導(dǎo)出數(shù)據(jù)”“這個(gè)按鈕只有主管能點(diǎn)”這時(shí)候才發(fā)現(xiàn)權(quán)限判斷早散落在每個(gè)按鈕的點(diǎn)擊事件里改一處漏三處。這篇筆記就是圍繞C# Winform里的用戶、角色、日志、操作權(quán)限這套完整模塊講怎么用數(shù)據(jù)庫(kù)把模型一次搭對(duì)再用Dapper把用戶創(chuàng)建、角色綁定、權(quán)限加載、日志記錄串成一條可靠鏈路。適合正在做Winform項(xiàng)目案例、準(zhǔn)備給系統(tǒng)加賬號(hào)體系的開(kāi)發(fā)者也適合給學(xué)校數(shù)據(jù)庫(kù)課程設(shè)計(jì)做參考。2. 先定數(shù)據(jù)模型用戶、角色、權(quán)限、日志五張表怎么設(shè)計(jì)2.1 五張表的分工為什么用戶不直接掛權(quán)限常見(jiàn)做法是采用RBAC模型用戶不直接和權(quán)限掛鉤而是通過(guò)“用戶-角色-權(quán)限”三層結(jié)構(gòu)來(lái)管理。這樣設(shè)計(jì)的直接好處是給三個(gè)新用戶分配權(quán)限時(shí)不用分別勾選十幾個(gè)權(quán)限項(xiàng)只要把他們都掛到“操作員”角色上即可。角色是權(quán)限的集合用戶是角色的成員權(quán)限變更只需要?jiǎng)咏巧?。整個(gè)模塊需要五張核心表SysUser用戶表存賬號(hào)、密碼哈希、鹽、狀態(tài)、創(chuàng)建時(shí)間、最后登錄時(shí)間。SysRole角色表存角色名、角色編碼、備注。SysUserRole用戶和角色的關(guān)聯(lián)表一個(gè)用戶掛多個(gè)角色一個(gè)角色被多個(gè)用戶使用。SysPermission權(quán)限表存權(quán)限編碼、權(quán)限名稱、所屬分組。SysRolePermission角色和權(quán)限的關(guān)聯(lián)表決定“這個(gè)角色能做什么”。再加上一張SysLog日志表記錄誰(shuí)在什么時(shí)間做了什么操作。六張表構(gòu)成了整個(gè)權(quán)限體系的地基。我見(jiàn)過(guò)有人圖省事在用戶表里加一個(gè)“權(quán)限字符串”字段把權(quán)限寫成“1,3,8,12”也有人用一張用戶表外加一張日志表就開(kāi)工。短期跑得通一旦出現(xiàn)“所有主管都要增加導(dǎo)出數(shù)據(jù)權(quán)限”這種需求用角色表只需要改一處角色權(quán)限關(guān)聯(lián)用權(quán)限字符串就得逐個(gè)用戶改過(guò)去改完還得擔(dān)心誰(shuí)漏了。所以在這個(gè)標(biāo)題的場(chǎng)景下五張表再加一張日志表是性價(jià)比最高的結(jié)構(gòu)。2.2 建庫(kù)腳本和初始化數(shù)據(jù)角色、權(quán)限碼一次配齊以SQL Server為例建表腳本如下。如果項(xiàng)目用MySQL把IDENTITY換成AUTO_INCREMENT、GETDATE換成NOW、NVARCHAR換成VARCHAR即可邏輯不變。CREATE TABLE SysUser ( UserId INT IDENTITY(1,1) PRIMARY KEY, UserName NVARCHAR(50) NOT NULL, PasswordHash NVARCHAR(128) NOT NULL, Salt NVARCHAR(32) NOT NULL, DisplayName NVARCHAR(50) NULL, IsEnabled BIT NOT NULL DEFAULT 1, CreateTime DATETIME NOT NULL DEFAULT GETDATE(), LastLoginTime DATETIME NULL ); CREATE TABLE SysRole ( RoleId INT IDENTITY(1,1) PRIMARY KEY, RoleName NVARCHAR(50) NOT NULL, RoleCode NVARCHAR(50) NOT NULL ); CREATE TABLE SysUserRole ( UserId INT NOT NULL, RoleId INT NOT NULL ); CREATE TABLE SysPermission ( PermissionId INT IDENTITY(1,1) PRIMARY KEY, PermissionCode NVARCHAR(50) NOT NULL, PermissionName NVARCHAR(50) NOT NULL, Category NVARCHAR(50) NULL ); CREATE TABLE SysRolePermission ( RoleId INT NOT NULL, PermissionId INT NOT NULL ); CREATE TABLE SysLog ( LogId BIGINT IDENTITY(1,1) PRIMARY KEY, UserId INT NULL, UserName NVARCHAR(50) NULL, ActionType NVARCHAR(50) NULL, Detail NVARCHAR(500) NULL, IpAddress NVARCHAR(50) NULL, CreateTime DATETIME NOT NULL DEFAULT GETDATE() );權(quán)限表里用PermissionCode作為業(yè)務(wù)判斷依據(jù)是個(gè)關(guān)鍵設(shè)計(jì)。比如“UserManage”“RoleManage”“DataImport”“DataExport”這些編碼在C#代碼里以字符串常量存在權(quán)限判斷時(shí)比較的是可讀的編碼而不是數(shù)字ID。這樣看代碼能看到含義排查問(wèn)題時(shí)也能直接對(duì)上號(hào)。初始化數(shù)據(jù)時(shí)把管理員角色和常用權(quán)限一次性寫入INSERT INTO SysRole (RoleName, RoleCode) VALUES (N管理員, NAdmin); INSERT INTO SysRole (RoleName, RoleCode) VALUES (N操作員, NOperator); INSERT INTO SysPermission (PermissionCode, PermissionName, Category) VALUES (NUserManage, N用戶管理, N系統(tǒng)管理), (NRoleManage, N角色管理, N系統(tǒng)管理), (NDataImport, N數(shù)據(jù)導(dǎo)入, N業(yè)務(wù)操作), (NDataExport, N數(shù)據(jù)導(dǎo)出, N業(yè)務(wù)操作), (NLogView, N日志查看, N系統(tǒng)管理); -- 管理員擁有全部權(quán)限 INSERT INTO SysRolePermission (RoleId, PermissionId) SELECT 1, PermissionId FROM SysPermission; -- 操作員只擁有數(shù)據(jù)導(dǎo)入和導(dǎo)出 INSERT INTO SysRolePermission (RoleId, PermissionId) SELECT 2, PermissionId FROM SysPermission WHERE PermissionCode IN (NDataImport, NDataExport);這段腳本有兩個(gè)取舍要說(shuō)明。第一沒(méi)有給關(guān)聯(lián)表設(shè)置物理外鍵只靠程序保證數(shù)據(jù)完整性。Winform內(nèi)部系統(tǒng)一般并發(fā)不高去掉物理外鍵可以避免刪除角色時(shí)被外鍵攔住、操作順序受限。如果團(tuán)隊(duì)規(guī)范允許可以加上外鍵求穩(wěn)。第二權(quán)限碼用NVARCHAR而非整數(shù)ID是我做權(quán)限系統(tǒng)的習(xí)慣具體原因在4.3節(jié)展開(kāi)。2.3 索引與連接串SQL Server、MySQL、SQLite怎么快速切換表建好后索引是登錄查詢快不快的前提。實(shí)際工作中最需要保證的是三條SysUser.UserName唯一索引登錄時(shí)按用戶名查用戶SysUserRole.RoleId索引加載用戶角色時(shí)按用戶ID反查SysRolePermission.RoleId索引加載角色權(quán)限時(shí)聯(lián)動(dòng)查詢。CREATE UNIQUE INDEX UX_SysUser_UserName ON SysUser(UserName); CREATE INDEX IX_SysUserRole_RoleId ON SysUserRole(RoleId); CREATE INDEX IX_SysRolePermission_RoleId ON SysRolePermission(RoleId);數(shù)據(jù)庫(kù)的選型會(huì)影響連接串和分頁(yè)寫法但表結(jié)構(gòu)可以保持一致。開(kāi)發(fā)階段我用SQLite或LocalDB提速部署時(shí)再切到SQL Server連接串可以用配置項(xiàng)區(qū)分。SqlConnection本身就帶連接池程序里每次new出來(lái)的連接關(guān)閉后回到池里復(fù)用不要在循環(huán)里頻繁打開(kāi)關(guān)閉同一個(gè)連接否則連接池耗盡后會(huì)出現(xiàn)“連接超時(shí)”的玄學(xué)問(wèn)題。這是Winform連數(shù)據(jù)庫(kù)最常見(jiàn)的隱性坑后面避坑章再細(xì)說(shuō)。3. 用戶創(chuàng)建與角色分配用Dapper把新增和授權(quán)寫進(jìn)一個(gè)事務(wù)3.1 用戶創(chuàng)建窗口從界面到數(shù)據(jù)庫(kù)的完整鏈路用戶創(chuàng)建的需求拆開(kāi)看只有兩步往SysUser插一條用戶記錄往SysUserRole插若干條關(guān)聯(lián)記錄。但“若干條”和“一條”必須同時(shí)成功或同時(shí)失敗。比如創(chuàng)建用戶成功、分配角色失敗程序里會(huì)出現(xiàn)一個(gè)沒(méi)有角色的賬號(hào)登錄后什么都做不了這種數(shù)據(jù)在排錯(cuò)時(shí)極難發(fā)現(xiàn)。常見(jiàn)做法是在新增用戶窗體里上方放用戶名、密碼、確認(rèn)密碼、顯示名下方放一個(gè)CheckedListBox展示所有角色點(diǎn)擊保存后一次提交。界面布局不是重點(diǎn)重點(diǎn)是數(shù)據(jù)鏈路。我一般用Dapper替代原來(lái)的DataSet和SqlCommand手寫參數(shù)原因很實(shí)際Dapper擴(kuò)展方法簡(jiǎn)單SQL可控性能開(kāi)銷極小團(tuán)隊(duì)里任何人接手都能看懂。密碼不能明文入庫(kù)入庫(kù)的是“鹽”和“哈希值”。鹽是每次生成的一串隨機(jī)字節(jié)轉(zhuǎn)Hex哈希用PBKDF2或SHA256計(jì)算。注意一件事同一個(gè)用戶登錄時(shí)必須用同一個(gè)鹽去重新計(jì)算哈希所以鹽必須單獨(dú)存一列不能只存一個(gè)哈希值。3.2 用Dapper把用戶和角色寫進(jìn)同一個(gè)事務(wù)下面是核心代碼。為了聚焦業(yè)務(wù)邏輯省略了控件取值部分但從方法簽名能看出入?yún)⒑统鰠ⅰublic bool CreateUserWithRoles(string userName, string password, string displayName, Listint roleIds) { // 1. 生成鹽和密碼哈希 string salt PasswordHelper.GenerateSalt(); string passwordHash PasswordHelper.HashPassword(password, salt); // 2. 插入用戶拿到自增主鍵 const string sqlUser INSERT INTO SysUser (UserName, PasswordHash, Salt, DisplayName, IsEnabled, CreateTime) VALUES (UserName, PasswordHash, Salt, DisplayName, 1, GETDATE()); SELECT CAST(SCOPE_IDENTITY() AS INT);; // 3. 插入用戶角色關(guān)聯(lián) const string sqlRole INSERT INTO SysUserRole (UserId, RoleId) VALUES (UserId, RoleId);; using (var conn new SqlConnection(_connectionString)) { conn.Open(); using (var tx conn.BeginTransaction()) { try { int newUserId conn.ExecuteScalarint(sqlUser, new { UserName userName, PasswordHash passwordHash, Salt salt, DisplayName displayName }, tx); foreach (int roleId in roleIds) { conn.Execute(sqlRole, new { UserId newUserId, RoleId roleId }, tx); } tx.Commit(); return true; } catch (Exception ex) { tx.Rollback(); Logger.Error(CreateUserWithRoles failed, ex); return false; } } } }參數(shù)說(shuō)明Dapper的匿名對(duì)象參數(shù)名和SQL里的參數(shù)名必須一一對(duì)應(yīng)ExecuteScalar 用來(lái)拿自增主鍵SQL Server里是SCOPE_IDENTITY而不是IDENTITY。事務(wù)是這里的主角。把Insert用戶和Insert角色放進(jìn)同一個(gè)BeginTransaction要么全提交要么全回滾。我在實(shí)際項(xiàng)目里見(jiàn)過(guò)有人分開(kāi)調(diào)用兩個(gè)方法執(zhí)行兩條SQL結(jié)果用戶創(chuàng)建成功、角色分配失敗最后靠手工寫腳本補(bǔ)數(shù)據(jù)才恢復(fù)。有了事務(wù)這類事故從根上斷了。PasswordHelper的生成邏輯也值得展開(kāi)GenerateSalt用RNGCryptoServiceProvider生成16字節(jié)隨機(jī)數(shù)轉(zhuǎn)Hex長(zhǎng)度32位HashPassword用Rfc2898DeriveBytes迭代10000次輸出128位十六進(jìn)制字符串。不要用MD5也不要只用一次SHA256理由在5.3節(jié)會(huì)講。3.3 參數(shù)校驗(yàn)清單空密碼、重復(fù)用戶名、停用角色怎么攔數(shù)據(jù)庫(kù)增刪改查只是基礎(chǔ)用戶模塊真正的麻煩在校驗(yàn)。以下三條校驗(yàn)我每次都會(huì)做漏掉任何一條都會(huì)在測(cè)試階段暴露。用戶名重復(fù)插入前先查一下SysUser里有沒(méi)有同名用戶。數(shù)據(jù)庫(kù)雖然有唯一索引兜底但Winform里重復(fù)點(diǎn)擊保存按鈕時(shí)兩個(gè)請(qǐng)求可能同時(shí)越過(guò)查詢直接插入唯一索引拋出的異常用戶體驗(yàn)極差。正確寫法是捕獲唯一索引沖突的SQLException轉(zhuǎn)成中文提示“用戶名已存在”而不是把異常堆棧直接彈給操作員??彰艽a和弱密碼密碼在客戶端不能為空這個(gè)校驗(yàn)要在按鈕點(diǎn)擊事件里先做而不是等數(shù)據(jù)庫(kù)報(bào)錯(cuò)。長(zhǎng)度校驗(yàn)至少6位如果這是給客戶內(nèi)部系統(tǒng)用可以在后臺(tái)留一個(gè)“是否強(qiáng)制強(qiáng)密碼”的配置項(xiàng)不寫死。停用角色角色表里可以加一個(gè)IsEnabled字段來(lái)區(qū)分啟用和停用。分配角色時(shí)CheckedListBox只勾選啟用角色保存前再校驗(yàn)一遍roleIds里沒(méi)有停用角色I(xiàn)D。不然用戶綁定了一個(gè)被停用的角色登錄時(shí)權(quán)限加載為空排查起來(lái)以為是權(quán)限bug其實(shí)是數(shù)據(jù)問(wèn)題。4. 操作權(quán)限設(shè)置登錄后按權(quán)限碼控制菜單和按鈕而不是到處if判斷4.1 登錄成功之后權(quán)限碼一次性加載進(jìn)內(nèi)存用戶登錄成功后第一件事不是跳轉(zhuǎn)主窗體而是把該用戶的所有權(quán)限碼查出來(lái)加載到內(nèi)存。這個(gè)查詢跨越四張表SysUser、SysUserRole、SysRolePermission、SysPermission。常見(jiàn)做法是寫一個(gè)靜態(tài)權(quán)限工具類加載后全程序共享。public static class PermissionHelper { private static readonly HashSetstring _permissions new HashSetstring(); public static void LoadPermissions(int userId) { _permissions.Clear(); const string sql SELECT DISTINCT p.PermissionCode FROM SysUser u INNER JOIN SysUserRole ur ON u.UserId ur.UserId INNER JOIN SysRolePermission rp ON ur.RoleId rp.RoleId INNER JOIN SysPermission p ON rp.PermissionId p.PermissionId WHERE u.UserId UserId AND u.IsEnabled 1;; using (var conn new SqlConnection(_connectionString)) { var codes conn.Querystring(sql, new { UserId userId }); foreach (var code in codes) { _permissions.Add(code); } } } public static bool HasPermission(string permissionCode) { return _permissions.Contains(permissionCode); } }參數(shù)說(shuō)明HashSet的Contains是O(1)判斷比每次訪問(wèn)數(shù)據(jù)庫(kù)判斷快得多權(quán)限碼統(tǒng)一用小寫或大寫風(fēng)格我建議全部用PascalCase和C#常量風(fēng)格保持一致。這個(gè)加載動(dòng)作必須在主窗體展示之前完成。如果用戶沒(méi)有登錄成功主窗體壓根不該出現(xiàn)。權(quán)限加載失敗時(shí)不能靜默吞掉異常否則界面上所有按鈕都會(huì)以“無(wú)權(quán)限”狀態(tài)呈現(xiàn)看起來(lái)像系統(tǒng)壞了實(shí)際是權(quán)限沒(méi)查出來(lái)。4.2 渲染時(shí)攔截菜單隱藏、按鈕禁用而不是點(diǎn)擊后才彈窗操作權(quán)限設(shè)置最容易寫崩的地方是權(quán)限判斷散落在按鈕點(diǎn)擊事件里。比如每給“刪除用戶”按鈕加一段if (PermissionHelper.HasPermission(UserManage)) else MessageBox.Show(無(wú)權(quán)限)。代碼能跑但一個(gè)窗體十幾個(gè)按鈕就要寫十幾段重復(fù)判斷而且按鈕只是點(diǎn)擊時(shí)提示用戶能看到一個(gè)點(diǎn)了沒(méi)反應(yīng)的按鈕體驗(yàn)很差。更穩(wěn)的做法是渲染時(shí)攔截窗體加載完成后遍歷所有需要控制的控件按權(quán)限碼統(tǒng)一設(shè)置Visible或Enabled。核心是寫一個(gè)遞歸掃描控件的方法private void ApplyPermission(Control root) { foreach (Control c in root.Controls) { if (c is Button btn btn.Tag ! null) { string code btn.Tag.ToString(); btn.Visible PermissionHelper.HasPermission(code); } else if (c is ToolStripMenuItem menu menu.Tag ! null) { string code menu.Tag.ToString(); menu.Visible PermissionHelper.HasPermission(code); } if (c.HasChildren) { ApplyPermission(c); } } }調(diào)用時(shí)機(jī)放在主窗體的Load事件里。關(guān)鍵點(diǎn)是控件的Tag屬性。給每個(gè)需要權(quán)限控制的按鈕和菜單設(shè)置Tag為權(quán)限碼代碼里不在業(yè)務(wù)邏輯里判斷權(quán)限只在渲染階段掃描一次。這樣權(quán)限變更時(shí)只需要改窗體的Tag不需要改按鈕的Click邏輯。做法反過(guò)來(lái)也成立登錄用戶擁有超管角色時(shí)直接跳過(guò)權(quán)限掃描所有控件可見(jiàn)普通角色走掃描邏輯。這是給管理員留后門的標(biāo)準(zhǔn)做法用角色編碼判斷。4.3 權(quán)限碼粒度按功能塊控制別把按鈕點(diǎn)成雪花粒度是操作權(quán)限設(shè)置最需要拿捏的地方。權(quán)限碼太少比如只有“管理員”和“普通用戶”兩種角色控制不細(xì)致權(quán)限碼太多比如“修改用戶姓名”“修改用戶密碼”“修改用戶郵箱”各一個(gè)權(quán)限碼權(quán)限配置界面會(huì)讓客戶看得頭皮發(fā)麻。我一般按功能塊劃分一個(gè)模塊一個(gè)權(quán)限碼。比如“UserManage”管用戶模塊的新增、修改、刪除、重置密碼“DataImport”管數(shù)據(jù)導(dǎo)入“DataExport”管數(shù)據(jù)導(dǎo)出。按鈕級(jí)別不再細(xì)分。原因是Winform內(nèi)部系統(tǒng)的使用群體有限操作員和管理員的職能差異遠(yuǎn)沒(méi)有大到需要給每個(gè)按鈕授權(quán)。權(quán)限碼數(shù)量控制在20個(gè)以內(nèi)配置界面用CheckBox分組勾選客戶能看明白程序也好維護(hù)。5. 用戶模塊開(kāi)發(fā)避坑權(quán)限散落、日志卡UI、MD5密碼等6條血淚經(jīng)驗(yàn)5.1 權(quán)限判斷散落在按鈕點(diǎn)擊事件里需求一變就要翻遍整個(gè)窗體現(xiàn)象客戶提出“操作員不能刪除用戶”開(kāi)發(fā)人員需要在五六個(gè)窗體的刪除按鈕點(diǎn)擊事件里分別加判斷。改完后測(cè)試發(fā)現(xiàn)列表右鍵菜單里的刪除沒(méi)攔、工具欄刪除沒(méi)攔、快捷鍵刪除沒(méi)攔。原因權(quán)限判斷分散在各處每個(gè)入口單獨(dú)寫一份if邏輯遺漏是必然的。改需求時(shí)找不到“所有需要判斷權(quán)限的地方”。解決用4.2節(jié)的控件掃描方案權(quán)限判斷集中到一處。所有按鈕、菜單的權(quán)限碼都通過(guò)Tag配置渲染時(shí)統(tǒng)一處理刪除用戶的方法內(nèi)部再加一道服務(wù)端校驗(yàn)UI層和業(yè)務(wù)層雙重保險(xiǎn)。這樣需求變更時(shí)只需要調(diào)整Tag或權(quán)限碼不用翻窗體代碼。5.2 日志直接寫在UI線程點(diǎn)幾下鼠標(biāo)界面就卡住現(xiàn)象用戶操作幾次后Winform界面越來(lái)越卡點(diǎn)擊按鈕要等一兩秒才有反應(yīng)。任務(wù)管理器看到進(jìn)程CPU不高但界面無(wú)響應(yīng)。原因日志表寫入操作直接放在按鈕點(diǎn)擊事件里同步執(zhí)行每次寫日志都占用UI線程操作一多UI線程全耗在等待數(shù)據(jù)庫(kù)響應(yīng)上。更隱蔽的是日志寫入失敗拋異常直接打斷正常業(yè)務(wù)操作。解決日志寫入統(tǒng)一走后臺(tái)線程不阻塞UI。常見(jiàn)做法是定義一個(gè)日志方法內(nèi)部用ThreadPool.QueueUserWorkItem或Task.Run把插入操作丟到后臺(tái)如果希望順序?qū)懭胗靡粋€(gè)日志隊(duì)列加單線程消費(fèi)。日志寫入失敗不能影響主流程寫日志的代碼整體包一層try-catch失敗就丟掉本次日志。5.3 密碼用MD5裸存被脫庫(kù)等于全網(wǎng)撞庫(kù)現(xiàn)象數(shù)據(jù)庫(kù)被拖走后攻擊者用彩虹表直接反查出大部分用戶的密碼包括管理員。因?yàn)镸D5相同的明文所有系統(tǒng)都一樣撞庫(kù)成本極低。原因開(kāi)發(fā)階段為了省事直接用MD5(密碼)存庫(kù)沒(méi)有加鹽也沒(méi)有迭代計(jì)算。MD5本身不是為密碼存儲(chǔ)設(shè)計(jì)的計(jì)算太快暴力破解成本低。解決用PBKDF2或bcrypt。代碼里已經(jīng)提到PasswordHelper核心是每人生成獨(dú)立鹽鹽和哈希一起存登錄時(shí)取出鹽重新計(jì)算哈希再比對(duì)。迭代次數(shù)不要低于10000這個(gè)開(kāi)銷在登錄時(shí)完全可以接受。老系統(tǒng)遷移時(shí)可以用“舊密碼哈希算法標(biāo)記”區(qū)分存量用戶用戶下次登錄自動(dòng)升級(jí)為新算法。5.4 刪除角色沒(méi)處理用戶角色關(guān)聯(lián)要么外鍵報(bào)錯(cuò)要么留孤兒數(shù)據(jù)現(xiàn)象刪除一個(gè)正在被用戶使用的角色系統(tǒng)報(bào)錯(cuò)“外鍵約束沖突”刪除不了或者去掉物理外鍵后直接刪除用戶登錄時(shí)加載不到權(quán)限成了“有賬號(hào)沒(méi)權(quán)限”的孤兒數(shù)據(jù)。原因刪除角色前沒(méi)有檢查SysUserRole和SysRolePermission表里有沒(méi)有關(guān)聯(lián)記錄。開(kāi)發(fā)階段圖省事不加物理外鍵刪除時(shí)不報(bào)錯(cuò)反而掩蓋了數(shù)據(jù)問(wèn)題。解決寫一個(gè)刪除角色的服務(wù)方法按順序檢查關(guān)聯(lián)表、刪除關(guān)聯(lián)數(shù)據(jù)、再刪角色表。刪除前彈窗提示“該角色下有3個(gè)用戶刪除后這些用戶將失去權(quán)限”。數(shù)據(jù)完整性靠代碼保證但提示和確認(rèn)環(huán)節(jié)不能省。這個(gè)邏輯放在一個(gè)事務(wù)里刪除失敗全部回滾。5.5 權(quán)限加載失敗時(shí)靜默吞掉異常整個(gè)窗體像沒(méi)裝權(quán)限一樣全開(kāi)現(xiàn)象某客戶端登錄后所有菜單按鈕全部可見(jiàn)點(diǎn)任何功能都能操作甚至包括“重置密碼”——實(shí)際上這個(gè)用戶只應(yīng)該看日志。原因加載權(quán)限的代碼里寫了空的catch塊或者加載SQL里表名拼錯(cuò)被捕獲后沒(méi)處理。權(quán)限集為空HasPermission永遠(yuǎn)返回false掃描邏輯把所有控件隱藏或顯示的邏輯寫反時(shí)會(huì)導(dǎo)致權(quán)限全部放開(kāi)。我見(jiàn)過(guò)最危險(xiǎn)的寫法是catch后直接return然后登錄流程繼續(xù)往下走。解決權(quán)限加載失敗必須中斷登錄流程拋出明確錯(cuò)誤不讓用戶進(jìn)入主界面。調(diào)試階段可以把加載結(jié)果打印出來(lái)核對(duì)上線后保留至少一條錯(cuò)誤日志。加一條驗(yàn)證邏輯加載完成后如果角色數(shù)大于0但權(quán)限數(shù)為0視為異常狀態(tài)記錄日志并提示管理員檢查角色權(quán)限配置。5.6 時(shí)間字段用字符串存日志排序和查詢?nèi)强蝇F(xiàn)象日志列表按CreateTime排序時(shí)出現(xiàn)“2024/1/10”排在“2024/1/9 23:59:59”前面的情況按日期范圍查詢?nèi)罩究傆幸粌商斓臄?shù)據(jù)查不出來(lái)。原因時(shí)間字段在數(shù)據(jù)庫(kù)里建成了VARCHAR插入時(shí)用了當(dāng)前時(shí)間的ToString()格式受系統(tǒng)區(qū)域設(shè)置影響排序規(guī)則是字符串字典序和自然時(shí)間序不一致。解決數(shù)據(jù)庫(kù)里時(shí)間字段一律用DATETIME或DATETIME2代碼里用DateTime.NowDapper自動(dòng)映射不要手動(dòng)ToString()。界面展示格式化放到顯示層做。如果有的項(xiàng)目已經(jīng)用字符串存了老數(shù)據(jù)遷移時(shí)用一個(gè)標(biāo)準(zhǔn)格式y(tǒng)yyy-MM-dd HH:mm:ss重新整理排序才能可靠。6. 權(quán)限驗(yàn)證SQL、熱刷新與日志歸檔上線后維護(hù)的三件小事6.1 一條SQL直接核對(duì)某個(gè)用戶有哪些權(quán)限程序界面上權(quán)限判斷是否符合預(yù)期開(kāi)發(fā)時(shí)無(wú)法全部靠點(diǎn)擊測(cè)試覆蓋。我的習(xí)慣是寫完權(quán)限模塊后直接在數(shù)據(jù)庫(kù)客戶端執(zhí)行一條SQL把某個(gè)用戶最終能執(zhí)行的功能碼列出來(lái)核對(duì)。SELECT DISTINCT p.PermissionCode, p.PermissionName FROM SysUser u INNER JOIN SysUserRole ur ON u.UserId ur.UserId INNER JOIN SysRole r ON ur.RoleId r.RoleId INNER JOIN SysRolePermission rp ON r.RoleId rp.RoleId INNER JOIN SysPermission p ON rp.PermissionId p.PermissionId WHERE u.UserName Nzhangsan AND u.IsEnabled 1 ORDER BY p.PermissionCode;這條SQL就是把登錄后的權(quán)限查詢單獨(dú)拿出來(lái)驗(yàn)證跑完能直接看到用戶掛了哪些角色、每個(gè)角色給了哪些權(quán)限。上線后客戶反饋“某人權(quán)限不對(duì)”先用這條SQL查數(shù)據(jù)再去看代碼邏輯能篩掉一半的誤報(bào)。6.2 權(quán)限熱刷新管理員改完權(quán)限不重啟程序Winform程序連續(xù)運(yùn)行幾天后管理員改了某角色的權(quán)限配置客戶端還保留著登錄時(shí)的內(nèi)存權(quán)限必須重啟才能生效。內(nèi)部系統(tǒng)這樣做影響不大但如果客戶端很多逐個(gè)重啟也是麻煩。我在權(quán)限模塊里加了一個(gè)重置按鈕管理員在主界面點(diǎn)擊“刷新權(quán)限”調(diào)用PermissionHelper.ClearPermissions()后重新按當(dāng)前登錄用戶ID走一遍加載流程界面控件再掃描一次。這樣權(quán)限熱更新不用重啟程序。實(shí)現(xiàn)時(shí)有個(gè)細(xì)節(jié)刷新前要記錄當(dāng)前窗體的權(quán)限狀態(tài)刷新后重新調(diào)用ApplyPermission即可否則已經(jīng)隱藏的按鈕不會(huì)自動(dòng)恢復(fù)。另外一個(gè)更省事的方案是提供一個(gè)隱藏快捷鍵管理員按F12調(diào)出權(quán)限刷新入口不影響普通用戶使用。6.3 日志歸檔按時(shí)間分區(qū)還是定時(shí)清理日志表只增不改時(shí)間久了SysLog會(huì)膨脹到幾千萬(wàn)行。Winform內(nèi)部系統(tǒng)一般不會(huì)高頻產(chǎn)生日志但“導(dǎo)出數(shù)據(jù)”“登錄失敗”這類操作每天都可能有幾百條一年積累下來(lái)也有幾十萬(wàn)行。日志查詢界面如果直接掃全表分頁(yè)會(huì)越翻越慢。我的做法是日志表保留最近半年的數(shù)據(jù)歸檔腳本每月月底把半年前的記錄插入到SysLog_History表再?gòu)闹鞅韯h除SysLog_History按月份分區(qū)或按年份分表。這個(gè)歸檔邏輯用數(shù)據(jù)庫(kù)計(jì)劃任務(wù)調(diào)度不需要Winform程序參與。日志表的數(shù)據(jù)量大是因?yàn)闆](méi)有歸檔策略不是數(shù)據(jù)庫(kù)不行這個(gè)問(wèn)題越早處理越輕松。最后說(shuō)一句我的習(xí)慣用戶模塊做完之后我會(huì)刻意用“新建用戶-分配角色-改權(quán)限-查日志”四個(gè)動(dòng)作走一遍全流程再故意制造幾類數(shù)據(jù)異常比如刪一個(gè)有用戶的角色、往日志表里寫超長(zhǎng)Detail字段。這套動(dòng)作堅(jiān)持下來(lái)線下踩掉的坑比上線后客戶發(fā)現(xiàn)的少得多。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色综合1991| 欧美日韩日产免费网站看| 亚洲AV无码国产成人| 亚洲国产一级黄色视频| 97天天在线| 啊啊啊不要好疼视频| 深夜国产一区二区三区在线看| 人妻91少妇| 91超碰碰在线| 国产男女无套97| 亚洲国产激情国产av| 激情网色| 国产精品成人久久一区二区三区| 久久高潮妇女视频| 久久久一区二区| 口爆欧美91| 天天日老熟妇| 欧美在线干| 黄色小视频日本txt| 国产400孕妇孕交群| 久久久久96| 亚洲色图国产另类| 97综合在线观看| 天天色悠悠激情| 99热在线播放| 久久久亚洲熟妇熟女| 久久AV无码AV| 蜜臀无码一区二区| 97国产综合欧美| 九九九久千久久激情蜜桃在线看 | 亚洲丝袜B诱惑| 东京热免费视频| www欧美性爱| 国产精品色片一区二区| 国产18精品亚洲精品| 日韩国产欧美伦理在线| 一本久道在线综合视频| 综合免费无码中文| 国产精品久久久久久 百度| www.91理论| 精品性爱一二三区| 激情婷婷五月天| 伊人五月天| 爽 好舒服 无码刺激久久| 91小视频| 亚洲色图91欧美日韩| 女人的久久久| 免费网色网站| 人人操人人精品影片| 干妹子| 日韩精品国模| 日韩性爱视频在线免费观看| 加勒比99999| 强奸乱亚洲| 日1区2区3区2020| 强奸乱伦大香蕉| 成人26uuu| 成人三级片无码| #NAME?| 精品熟妇视频一区二区| 精品午夜福利| 欧美十八禁网站| 亚洲欧美精品一区天堂久久| 爱干爱射网啊啊啊| 久久妇| 一级AAA片一区二区三区| 超碰九7| 秋霞一集毛片观看| 伊人久久大香大香线蕉中文| 91爱综合| 久9爱精品| 超碰97中文| 无码 黑人一区二区三区| 国产精选三级在线观看| 91亚州欧美| 亚洲精品黑丝| 操一操摸一摸| 国产 丝袜 欧美中文 另类| 六月丁香啪啪啪| 啊啊啊啊啊操我视频| 日韩少妇无吗| 国产精品一区二区手机看片| 在线观看黄色电话| 人妻精品4K4K4K4K4| 97免费视频在线观看视频| 欧美亚洲天天| AV污污污污| 夜夜爽妓女| 欧美日本视频一区| 丝袜剧情| 欧亚日本情色| 狠狠色狠狠色狠狠五月| 九九九九九九亚洲| 偷拍盗拍亚洲色图图片| 国产一区二区三区精品观看啪| 天天肏美女| 欧美,亚洲,日韩,v,天堂,手机在线观看| 亚洲男人电影天堂| 99热精品免费| 偷拍欧美亚洲| 91精品人妻电影| 日日日啊啊啊| 国产一区免费午夜视频| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 青青三级视频| 熟女人妇一区二区三区| 嗯,啊。舔我逼| 一中国女人毛片水真多| 色女女女导航| 国产熟女精品区| 美女刺激久久国产欧美| 美女主播色欲91抠b在线播放| 极品出轨视频网站| 久久久久国产无av| 我想要啊 啊 啊| 亚洲无码超碰免费| 五月天伊人| 欧美激情 亚洲色图| 日韩国产中文字幕| 97 国产精品| 性在久久久久久| 久久夜嗨| 国产超碰在线| 精品人妻中文字幕高清| 夜夜操老骚逼视频网站| 一区不卡在线观看av| 狼人综合婷婷激情四射 | 久久成人网站| 色99视频| 在线αⅴ| 很很很很操| 人人操人人插人人摸人人干| 人人妻人人色一区二区三区| 一品道视频一区二区三区| 97超碰超碰| 欧美亚州手机在线| 精品国产一区二区三区四区在线看 | 欧美熟妇视频| 精品人妻一区二区视频| 狠狠爱夜夜干| 伊人97超碰| 国产精品午夜福利亚洲综合网| 九九久久99| 最新中文字幕精品在线| 日韩成人小视频| 国模一区二区三区| 欧美性生活免费网| 国产丝袜啪啪| 大香蕉天天看妹子| 日韩无码专区| 黑人精品一区二区在线播放| 日韩精品人妻中文字幕不卡乱码| 男人的天堂成人的社区| 日韩,欧美,中文在线| 久久一区二区蜜桃| 国产精品久久久777| 国产日韩欧美亚洲精品95| 春色综合免费| 色婷婷成人综合| 国产色呦呦| 亚洲一区二区在线观看91| 天天摸夜夜操视频| 91九九九馒头| 国产欧美亚洲精品a第2页| 人妻少妇精品视频一区二区三区| 自拍亚洲综合| 成人欧美日超碰| 久热免费视频| 在线观看日韩av不卡| 毛片久久| 淫荡网址| 南澳成人一级片在线播放| 中文字幕88av在线| 欧美夜夜狠| 999岛国大片| 国产综合日韩伦理| 九九操久久国产免费视频| 区二区亚洲婷| 天堂在线一区二区| 四虎AV无码| www色色色com| 国产成人无码久久精品| 51一区二区三区| 黄色香蕉视频网站一区| 精品99999| 丰满人妻一区二区三区四区| 亚洲九九视频| 91亚洲狠狠色| 日韩欧美~中文字| 欧美久久人妻少妇一区二区| 天天内射| 色97欧美| 大香蕉伊人75| 亚洲人妻五月丁香婷婷| 青青草一区二区高清无码视频| 射丝袜大香蕉| 欧美精品,四区。五区| 欧美在线55555| 国产精品网站免费| 91人妻久久久久久久久久久久久| 中文久久96| 久久夜夜夜| 蜜臀亚洲中文| 日欧毛片久久| 亚洲熟女少妇免费视频| 91无码人妻精品一区二区三区蜜桃| 99色骚| 久久九七| 国产性爱欧美性爱在线| 本道综合精品| 天天澡天天狠天天天做| 被窝影院午夜看片无码| 亚洲av综合伊人久久| 国产精品嫩草影院午夜两性| 日欧操屄| 国产精品一二三在线看| 青娱乐日韩无码| 婷婷视频网| 蜜臀久久99精品久久久老,,| 亚洲不卡av在线| 日日A∨| a人欧美综合天堂麻豆| 国模不卡一本二本三电影| 四虎884a| 欧美综合综合| 午夜操逼不卡| 26uuu国产| 亚洲精品蜜桃久久久一区二区三区| 久久99国产综合精品女同| 日本A级视频| 色制服丝袜夫妻av一区| 超碰人人干天天射| 亚洲欧美高清无码| 爽 好舒服 无码刺激久久| 婷婷五月天色| 激情文学 亚洲图片| 土豪酒店各种姿势玩弄极品幼稚| 亚洲欧美97√| 综合在线导航一区| 蜜桃臀av在线观看| 夜夜嗨绯色| 国产九九九九九九| 欧美五十路熟| 日本大片日本一区二区免费高清| 中文字幕久久精视频久久大全| 天天射夜夜| 久久香蕉国产线看观看亚洲女人| 一本色道无码DVD中文字幕| 国产日韩在线播放av| 五月婷婷啪啪| 嫩草影院永久在线制服丝袜| 婷婷av在线中文字幕| 欧美v亚洲v日韩v最新在线二区| 长长久久曰曰夜夜成人网| 99久久无色码| 97操B| 欧美黄片免费在线观看视频| baisiav| 久久久96精品| 永久免费av无码网站国产app| 超碰成人最新最好看| 97人肏| 超碰偷拍| 首页中文字幕中文字幕免费| 久热精品色情| 日产操逼| 丁香五月性| 色天堂在线观看| 日本伦乱九九九综合| 日本在线不卡一二区| 台湾大香蕉99热| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 一本色道熟妇| 中文操嬖片。| 色九九九综合| WWW啪啪的com| 91性生活久久久| 99re在线| 亚洲国产综合久久天堂| 99操逼| 7777欧美成是人在线观看| AV在线资源| 97超碰磁| 影音先锋一区二区在线资源| 香港澳门日本三级网站| 99久久com免费视频′| 97视频免费播放| 久热大香蕉| 四虎av在线| 国内毛片无码一级毛片| 国产又粗又长又大的视频| 欧美性爱在线无码| 伊人在线大香蕉视频久久| 无码外流操逼视频| 天美精品一区二区三区四区在线观看| 欧美爱三级日韩久久| 综合国产97| 亚洲无码 国产无码| 久久久亚洲精品电影免费看| 乱伦熟女论坛| 操死我了嗯嗯嗯| 精品久久久高清无码| 日韩丝袜高跟制服在线观看| 大香蕉免费乱伦视频| 啊啊啊啊啊舒服| 国产高清精品福利| 亚洲a色| 欧苏综合色综合| 99中文字幕| 亚洲丝袜B诱惑| a片久久久久久久久久久久 | 久久久四区| 日韩亚洲美女一区久久| 男插女青青影院| 麻豆伊人网| 人妻81p| 男女啊啊啊啊啊| 色香阁在线| 操日韩第| 黑人综合网| 久久这里| 国产毛片精品一区二区色欲黄A片| 精品国产乱码久久久影院| 久久黄色网址| 黄色免费网页无码| 搡老熟女免费视频| 国产97色在线 | 亚洲| 狠狠中文字幕| 九九久久一区二区伦理| 亚州综合网| 欧美国产一区二区三区麻豆传媒 | 国产精品日日摸天天碰| 伊人丝袜美腿高跟在线观看高清| 日韩av乱伦| 最新无码国产| 老司机福利社视频在线观看| 大香蕉在线免| 中文字暮97| 国产小黄片在线免费观看 | 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 免费伦费视频在线观看| 国产精品一区二区手机看片| 伊人性在线视频| 久久e6只有精品| 国产AV高清AV无码| 1级黄色夫妻对换性交免费看| 极品少妇久久久久| 欧美综合自拍亚洲综合图| 亚洲国产一区二区三区在线| 中文字幕免费看大片| 中文字幕在线免费观看2| 四季av一区二区凹凸精品小说| 在线视频一区二区传媒| 东北夫妻性偷拍| 99热这里只有精品地址| 美国一区二区三区视频| 久久久性| 国产精品自拍视频| 亚洲天天自拍| 骚妻少妇精品性色无码四色A V| 粉嫩国产精品久久久| 婷婷月色| 99操| 午夜天堂精品久久久久91| 亚洲午夜福利在线影院| 成人性爱av| 欧美精品成人一区二区在线观看 | 天天综合精品| 99久久网站| 欧美日本一区二区a人| 成人自拍三级在线观看| 亚洲国产欧美一区二区潘金莲| 91精品老女人| 欧美夜夜| 高清国产无码av| 私人尤物在线精品不卡| 亚洲av青草久久一区二区| 中文字幕乱妇免费视频| 国产精品久久久久婷婷二区次| 女人18精品一区二区三区| 国产视频第2页| 99re99视频在线免费观看| 久久水蜜臀亚洲AV无码精品| 日韩78m视频| 老女人老91妇女老热女| 手机av亚洲丝袜美腿日韩第一页二页| 欧亚成人在线视频| 亚洲熟女偷拍在线观看| 熟女露脸激情自拍视频| 四虎免费在线播放| 中文字幕一区二区三区人妻不卡 | 色婷婷狠狠18禁| 国产版a级片直播在线| 国产精品免费美女视频| 爱做久久久久久| 狠狠操狠狠爱| 青青11操操操操操操操操| 九九久久一区二区三区| 安徽熟妇视频| 人妻熟妇久草在线| 精品国产乱码久久久影院| 超碰美国| 午夜福利激情在线视频| 日本操嫩b网| 91精品大奶人妻| 国产原创自拍| 久久九七| 9997se| 懂色Av| 秋霞成人一级在线观看| 日韩性爱播放| 亚洲欧洲无码97久久精品| 亚洲天堂日本| 欧美劲爆第一页| 在线观看一级α片刺激高潮视频| 岛国片国产成人亚洲播放| 九九色逼| 天美传媒av在线| 亚洲男人天堂手机版| 91精品无码久久久久久久| 日本三级一区二区 在线| 99热只有这里有精品| 激情深爱五月天| 日韩/97| 久久久草草精品| 高清孕妇孕交| 免费看欧美美女黄色大片| 99久久久无码| 国产精品电| 熟妇乱伦一区二区| www.av在线观看| 亚洲s在线观看| 国产AV线| 神马久久久久久伦理片| 中文字幕老熟妇黄色视频| 免费啊啊啊| 日本一区二区三区四区五区六区七区八区九区| xxxx网站亚洲精品| 欧美激情视频一区二区三区不卡| 日韩精品三级| 日操粉逼逼| 色婷婷综合久久久久中文一区二区| 肉丝无码中文高清| 中国一级操逼视频| 歐美一級亂黃99在綫精品| 久久9精品网站| 国产日韩在线播放av| 婷婷六月色| 熟女91网| 人妻乱仑一区二区三区| 夜夜 中文视频rt| 亚洲一区操| 射 色综合| 9丨久久九九九| 手机在线看片免费人成视频| 99re在线视频| 国产精品成人福利在线| 久久精品72| 乱伦一二三| 97人妻色| dy888午夜老子影视达达兔| www.色99| 99re这里只有| 九九成人视频| 久久丝袜| 日韩欧美女优电影| 超碰97护士| 九九九九九九九精品视频| 日韩无码第3页| 国内三级自拍小视频在线观看 | wwwcaobibi| 狠狠操狠狠燥| 午夜高清成人在线视频| 黄站在线免费观看| 99综合免费视频| 九九热精品视频六| 加勒比大香蕉视频在线| 激情综合网激情综合| 九九热男人天堂| 综合av社区| 99在线观看无大码| 亚洲欧美中文一区二区三| 黄色十八禁| 国产福利av精彩对白| 噜噜噜亚洲精| 国产欧美日韩女同性恋ww喷水精品 | 国产60页| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 亚洲色图伊人网| 国产精品自拍欧美在线| 欧美亚州综合网图片| 在线 制服丝袜中出 人妻| 黑人娇小av在线播放| 毛片视频白嫩| 亚洲第一狼人丝袜美女另类| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 手机不卡视频不卡在线一二三区 | 97超碰逼| 欧美刺激色黄片免费看| 校园春色亚洲| 国产精品天干天干综合网麻豆 | 午夜毛片高清免费不卡| 国产精品呦一区二区三区| 91丨人妻丨国产丨丝袜| 五月婷婷综合网| 亚洲欧美色图| 上床不卡网站| 99re95| 强奸乱伦av电影| 人妻熟女一区二区三区视频| 久久久久9| 国内外色色色色色成人视频| 日本一区二区成人在线| 熟女视频久久| 五月婷婷久久综合| 99热 按摩 日韩| 91亚洲网| 亚洲无992tv| 97色色色| 国模91| 69超碰综合| 伊人久久在线视频观看| 美女性91| 黄色av播放免不| 中文字幕加勒比海高清无码免费视频| 亚洲午夜福利视频| 成人av影院在线观看| 国产精品成人午夜福利| 欲色啪| 91天堂视频| 91粉芽高清在线一区二区| 欧美日韩性爱无码| 久久婷婷电影网| 麻豆天美在线| 91亚.色| 91久久国产综合精品| 久久国产精品91| 五月天综合网| 熟女被操视频网址| 成人日本视频人妻在线| 国产女乱淫真高清免费视频| 国产一区二区三区高清视频| 亚洲在线欧美| 高清无码人妻久久久一区二区三区aⅴ| 久久熟女久| 国产精品熟女AV中文字幕在线播放| 99热精品在线播放| 欧美在线播放aaaa| 717影院理论午夜伦八戒| 综合久久六月久久婷婷| 午夜激情成人在线观看| 男女猛烈无遮掩视频免费软件| 欧美91在线| 蜜臀99久久精品久久久久| 农村少妇久久久久久久| 综合网少妇| 久久精品操| 欧美色图片色哟哟| 九九热精品视频六| 久热这里只有精品9| 欧美久久人体| 992视频一区| 香蕉人欧美综合| 国产精品视频内谢女人| 欧美人与动性人交a| 国产一级内射高清视频| 色屁屁影院www国产| 操b在线观看| 欧美Aⅴ| 欧美精品成人在线播放| 国产精品自拍欧美在线| 亚洲精品亚洲人成人网| 性色一线| 99re只有精品| se,,,亚洲欧美| 欧美日韩人妻精品一区二区三区 | 亚洲欧美另类激情小说| 国产亚洲色停停久久99精品91| 亚洲 小说 欧美 激情 另类| 狠狠中文字幕| 狠狠干婷婷| 人妻日日夜夜精品| 新视频sss国产| 人妻少妇精品无码专区二区密桃| 欧洲人妻视频| 操人人| 黄片无码在线制服| 欧美男人一区| 日韩欧美水蜜桃人妻| 丰满熟妇大乳做爰| 久久精品国产亚洲AV清纯| 日韩中文字幕人妻视频| www.超碰在线| 三级网站超变态精品| 91亚洲狠狠色| 另类图片欧美激情综合| 强奸乱伦日韩AV| 九九视品黄色| 色悠久久久av| 99re免费视频精品全部| 国产免费永久精品无码| 大香蕉欧美伊| 天天综合网~91| 天天激情综合站| 婷婷综合| 亚洲超碰综合网| 天美传媒婬乱| 日本熟女中文| 国产中文福利| 夜夜精品视频| 欧美性爱视频免费一区一A| 日本特黄f c2| 欧美亚洲韩国视频十五区 | 少妇 综合| 亚洲图片欧美另类综合免费视频大大香| 试看60秒 爽| 黄色一级视| 亚州人妻| 日本操逼视频免费| 九九热AV| 久久风骚城市| 黄色一区二区秘书性感| 无码一区二区三区四区五区六区七区八区九区十区视频 | 成人aⅴ一区二区三区| 91蜜臀熟女| 欧美亚洲天天| 国产精品老师| 久久久九精品| 99精品视频在线观看免费| 中文字幕亚洲欧美在线不卡| 91精品人妻一区二区三区蜜桃| 欧美劲爆视频一区二区| 国产av热热色| 亚川综合视频| 人妻一区久久二区三区色播| 九九九九免费| 久久精品国产精品亚洲艾通辽熟妇 | 天天干2019| 97在线免费视频观看| 久操精品网| 日韩欧美蜜桃精品久久中文字幕久久| 国产精品干干干| 区二区亚洲婷| 偷拍亚洲熟女视频播放| 午夜啊啊啊| 日本色色视频网站| 日han少妇无码| 亚洲成人在线高清| 亚洲97P| 伊人网青青| 欧美一二三区四五区| 偷拍偷窥与盗摄视频专区| 欧美熟爽综合| 自拍偷拍国产欧美日韩韩| 伊人久久国产免费观看视频| 国产主播福利| 久久一二三四不卡| 99精品久久久久久久婷婷| 中文字幕伊人| 超碰99在线观看| 久久久久久久9| 欧美大码在线视频| 岛国1区2区3区在线观看| 伊人网在线观看| 黄色AAAAA欧美| 肉丝中文无码高清| 国产 码在线成人网站| 校园春色 欧美| 精品久久久久瑟瑟| jk白丝没脱就开始啪啪| 国产精品69久久久久久久| 成人短视频在线观看| 日韩97P| 久久綜合很很很| 中国国国产一级特黄毛片| 青女偷拍网| 亚洲中文字幕妇伦久久| www..com操老师| AV中文字幕三四五| 国产白嫩精品久久| 日韩激情中文字幕有码| 78超碰| 好看的久久不射无码影视影院| 亚洲日韩国产欧美综合v| 青草一区二区| 精品无码人妻一区二区免费蜜桃| 亚洲第一在线视频| 搡老熟女免费视频 | 老熟女综合网| 熟女中出视频| 超碰AV在线| 少妇厨房愉情理伦片bd在线观看| 91精品婷婷国产综合久久| 78综合网| 天天躁日日躁AAA片李宗瑞| 国产精品香蕉| 国产中午字一暮区| 欧美色图片91| 丁香六月婷婷| 国产精品久久久久久无码红治院| sewuyueav| 天天综合网~91综合网| 96久久科窝| 欧美网站免费| 第四色奇米影视777| 2020中文字幕在线观看| 国产精品久久久久久9999| xxx亚洲午夜天堂| 色色色色网站| jizzjizz欧美| 日韩字幕一区| 91无遮挡| 97久久国产精品女不卡| 91AV天美在线视频| 台湾大香蕉99热| 女优免费一区二区永久| 精品超碰国产| 国产一区二区欧美日本| 久久久久久人妻一区精品色欧美| 九九九九热| 亚洲激情在线| 天天干人妻视频| 亚洲。天堂。日本在线观看| 久久久久久91香蕉国产| 18一区二区三区| 色色99| 伊人久久婷婷| 免费精品福利在线观看| 国产综合网站在线播放 | 亚洲精品一二区| 亚洲欧洲无码bt精品合集| 91欧美综合| 九久9精品| 欧中美三级一区二区三区| 色哟哟AV| 亚洲素人综合| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 男人的天堂成人的社区| 亚洲欧美九九| 内射中出日韩在线观看视频| 综合日本女人伊人| 97色冈| 国产精品熟女AV中文字幕在线播放| 天天影视综合网欧美精品| 啊…啊…操我用力操我| 九九热精品视频在线观看| 五月天开心网| 射 色综合| 九九九午夜| 丝袜综合色图| 后入式在线免费观看60秒| 亚洲欧美日产国产91毛片| 亚洲综合性网址| 长久操视频| 新怡红院| 欧美亚洲综合高清在线| 麻豆久久精品亚洲精品88| 丁香婷婷五月| 精品中文字幕一区二区| 无码精品蜜桃一区二区三区ww| 国产男人又猛又粗又爽| www.色综合| 日韩欧美女优电影| 九九成人精品| 青青草日韩免费观看高清在线| 天天日骚逼熟女| 亚洲美女精品九九视频| 2023天天操夜夜操| 成人性爱视频在线看| 亚洲制服欧美另类内射| 好吊妞转入那个网| 最新亚洲风情电影| 麻豆色99999| 超碰免费97| 青青伊人这里只有精品| 国产无马av| 蜜伊人色综合97| 最新9久久久9免费视频| 少妇无码999| 性爱网站一区二区| 国模精品娜娜一二三区| 99热超碰| 亚洲怡春院| 欧美天天射| 青娱乐久久艹| 久久久久国产亚洲一区欧美色图日韩 | 精品一二三区女同| 啪啪自拍九九综合| 久久久久久日韩| 婷婷五月色| 丝袜美女诱惑 91 视频| 特色a在线上| 99性爱在线观看| 日本久久久久久久久| 成人久久久精品| 婷婷婷婷婷婷久久久久| 激情干在线| 欧美激情超碰777| 91 偷| AAAAAAAAA黄片| 任我爽视频在线观看| 热热色青青草| 亚洲欧美日韩免费电影| 极品色社| 丝袜美腿丝袜| 天天视频黄网站| 九九久久国产精品| 超碰2017| 婷婷色色五月| 亚洲色综网| 久久黄色性爱视频| 蜜臀亚洲中文| 狠日欧美| 五月天激情网图片| 色婷婷A V一二三四区麻豆综合| 超碰精品国产无码| 超碰97起碰| 欧亚 另类 久| 操屄不卡视频| 超碰午夜| 可以在线观看的黄色网址| 极品白嫩福利在线| 亚洲97在线观看| 丁香六月婷| 久久久999国产| 曰韩成人免费视频| 日韩久草| 伊人五月天激情| www.男人天堂| 久久精品久久九九精品| 天天做天天爱天天爽AV| 日韩特级毛片免费观看全集| 色综合91| 偷拍精品一区二区三区| 亚洲国产精品乱码在线观看| 另类欧美色| 91校园春色长篇| 色图综合| 大香蕉在线视频15| 亚洲精品久久久久毛片A片拉屎| 久久午夜伦| 亚洲欧美不卡线| 亚洲天堂区| 狠狠91| 视频在线观看一二三区| 乱伦一二三区| 另类av综合久久| 欧亚乱色熟女一区二区| 免费男人的天堂| 人人扣人人操| 91这里只有精品| 欧洲中文字幕| 亚洲图片激情综合另类| 91丨精品丨国产丨丝袜| 大香网站| 少妇三p| 91美腿丝袜在线观看| 国内偷拍精品一区二区| 伊人网在线观看| 日本成人电影资源网| 97中文综合| 大胆91| 久久免费99精品久久久久久| 天天天天天超碰| 精品成人av一区二区三区在线| 欧美色图20P| 免費人妻夜夜爽天天爽爽一区| 翔田千里无码中出中文字幕| 欧美国产有色电影| 色吧综合网| 国产精品不卡av免费在线观看| 99re95| 国产一区二区视频在线播放| 爱逼综合| 夜精品久无码| 日本三级黄页| 性爱Av免费| 国产美女高潮视频| 成人无码专区精品视频| 九九探花视频在线观看| 亚洲图片91| 国产人妻一区二区三区欧美毛片| 日韩欧美字幕亚洲一区二区 | 少妇被玩视频二三区| A 在线网址| 精品人妻一区二区三区视频在线| 欧美日韩国产男人| 色啪网| 八戒无码国产午夜福利| 精品人妻一区二区三区视频在线| 麻豆天美制片厂网站视频| 岛国成人av在线播放网址| 亚洲精品一二牛牛| 有码专区最新中文字幕有码| 亚洲人在线| 强奸乱亚洲| 日韩欧美aⅴ综合网站发布| 91熟女丨老女人| 91强在线播放| 中文一区二区婷婷视频| 国产久久久久久久久一区二区| 老熟女乱伦一区| 精品传媒在线一区| 激情啪啪视频| 妇女视频网站| 最新加勒比丝袜在线| 黄片www.| 国产A v无码专区| 久久性爱视频免费看| 日韩久射综合| 蜜桃午夜视频一区二区 | 日本在线999| 在线小说视频一区| 欧美页片| 69综合网| 高潮内射在线| 色噜噜综合在线| 色爱综合网| 亚洲中文字母在线播放| 国产精品无码久久久久2025| 日韩在线观看三级电影| 91亚洲欧美激情| 夜夜黄| 欧美性五月| 久久精品国产久精国产| 99青青草国产视频| 国产视频一区二区三区久久亚洲天堂 | 黑人精品久久97| 熟妇艹鸡八| 日韩超碰精品综合| 97欧美精品综合| 熟妇人妻一区二区| 操人妻丝袜高跟| 久久免费老司机精品| 中文字幕人妻丝袜| 国产剧情一区在线观看| 婷婷六月色| 激情六月天| 美女黄色一级A视频| 五月天激情小说| 婷婷五月天影院| 亚洲av在线免费观看| 激情五月天网站| 超碰97精品在线| 99啪啪视频| 玖玖资源中文字幕制服丝袜| 欧美日韩亚洲五月天婷婷| 久久成人午夜狠狠| 东北女人性交| 亚洲精品97久久| 一区二区三区看视频| 伊人骚琪琪亚洲天堂网站| 日本精品五区| 精品视频在线观看精品| 天天谢天天干| 欧美另类综合久久| 国产女人成人精品视频| 人妻久久久| 日本天天人人狠狠在线日美女 | 大香蕉之青青草原| 东京热AV男人的天堂| 综合色欧美| 呦呦影院| 郑州宾馆老熟女露脸啪啪| 大地资源在线观看中文第二页| 99精品免费| 成人久久无码www| 碰超人人在线一区二区三区| 夜夜高潮夜夜爽国产伦精品| 日韩少妇无码| 欧美日韩国产黄色片| 日本国产成人亚洲精品无码| 天天欧美欧美亚洲网| 97大色网| 欧美 日韩第一性色| 精品午夜福利| 色色福利| 蜜臀久久99精品久久久老,,| 亚州久久9| 久久久一区二区三区麻豆| 2024年最新色情网站在线观看| 人人操肉肉| 日韩三级视频一区二区三区| 青青国产在线拍揄自揄拍| 九九九九精品在线| 秋霞一级鲁丝片A片| 人人透人人操| 青青草十区九区爱夜| 久肏视频字幕| 色欲三区| 五月天色图影视| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 免费精品无码一级毛片牛牛影视 | 美女爽到高潮91| 伦激情人妻另类人妻| 超碰99热| 碰超人人在线一区二区三区| 97国产人人| 亚洲中文字幕三级在线| 中文字幕少妇色| 极品少妇久久久| 天天视频黄网站| 欧美五区| 欧美精品97| 国产做?爰片久久毛片?片美国| 亚洲天堂自拍| 青草精品视频-日本久久久久网站| 国产精品一级毛片不卡视| 女人妻一区| 老熟女综合网| 3P乱轮视频| 操学生天天| 精品无码久久久久久久久果冻糖心 | 欧美日韩夜夜| 夜夜嗨一区二区三区直播内容| 国产探花精品在线| 老师充足的奶水小说| 丝袜AV一区二区三区| 国产成人www免费人成看片| 欧美综合在线91| 91一区二区三区蜜桃| 亚州操操穴网| 搡老女人老91妇女老熟女| 97色在线| 97操B| 爱我干综合| 国产国产亚洲一二三久久| 国产成人bd在线观看| 亚洲资源网| 中文字幕亚洲热播人妻| 粉嫩小泬久久久一区二区| 亚洲激情在线观看一区| 麻豆影音天美视频| 白丝被操91| 精品国产91久久久久久一区黄无| 欧美一级在线观看成人| 97视频观看| 日本在线观看网址| 中文字幕乱碼在线| 极品综合| 九九国产| 国产真实野战在线视频| 国产精品电| 啊视频在线| 色妺妺AⅤ| 啊啊啊 在线观看| a男人的天堂久久一级A毛片| 啊啊啊好舒服好爽啊啊啊视频| 国产成年女人免费视频播放a| 夜夜狠狠躁日日躁色视频| 日本免费人成视频播放120秒| 亚州熟妇精品| 日本在线播放不卡一区| 亚州,欧美在线| 久久婷婷五月| 九九九热| 久久爱超碰网| 性爱1区| 亚洲天天操| 欧美一二在线| 网页导航五月天免费一二三区| 欧美综合色图片| 久操高青| 国产绿奴视频在线观看| 久操| 久久久久久久一级黄色打同平台| 黑人娇小av在线播放| 久久色一区二区| 人人扣人人操| 翔田千里AV无码秘 三区| 亚洲97p| 91Chinese在线| 三级精品三级在线观看| 91国产丝袜美女| 97久久精品亚洲| 国产91啪| 欧美97超碰| 99热这里只有是精品10| 91久久久久久| 一级人妻性爱视频| 欧美日韩国产精品久久色婷婷| 欧美精品成人亚洲| 国产h片在线观看视频| 97色综合中文网| 成人精品一区二区三区| 日本三级韩国三级99| 丁香六月激情| 精品对白久久不卡| 二三四区精品| 国产蜜臀精品一区免费尤物| 午夜福利精品| 国产乱伦视频污| 日韩射图| 美女诱惑在线一区| 精品精品精品| 天天干夜夜操网| 性爱网站一区二区| 欧美色干| 加勒比色综合| 91最新综合| www.色99| 欧美性爱三区二区| 高清国产无码av| 国产97免费视频| 久久久九九| 国产精品高潮久久AV| 在线黄页看毛片| 自拍偷拍2025在线观看| 中文字幕精品一区欧美| 激情小说亚洲| 农村少妇久久久久久久| 亚洲精品一区二区免费在线观看| 99青草| 免费观看欧美日韩操逼视频| 亚洲最大的综合性av| 东京热视频网| 日韩欧无码一区二区三区免费不卡| 成人AV在线网站| 婷婷九月国产| 极品久久久久久久久久久久久久| 香蕉99秘 精品一区丁香| 五月丁香成人网| 2024人人操人人摸| 国语对白在线播放视频| 国产精品美女久久久久AⅤ国产馆| 日韩兔费看黄片| 男人的天堂2018| 91成人无码| 9Ⅰ超碰| 超碰人妻久久| 人妻少妇精品视频一区二区三区| 精品一区二区2| 97视频免费在线| 后入式999| 国产夫妻性生活视频| 亚洲国产日韩欧美熟妇在线| 思思热免费视频观看| 国产女乱淫真高清免费视频| 中文字幕高清精品一区| 日韩免费高清大片在线| 久久精品国产亚洲AV清纯| 色爱天堂| 蜜臀久久99精品久久久久久婷婷| 国产区在线| 夜夜爽夜夜操| 97chaopengongkai| 97天天| 女色综合| 狠狠婷婷亚洲中文综合久久| 精品国产乱码久久久久久网站入口| 男人天堂新在线| 欧美日韩1234| 欧美成人性爱视频在线播放| 欧美日韩另类字幕中文| 91强在线播放| 97超碰欧美手机在线| 就去色综合| 久久精品国产亚洲AV先锋| 亚洲AV无码乱码| CCYY草草影院地址入口|