日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

EF Core 数据变更自动审计设计

發布時間:2023/12/4 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 EF Core 数据变更自动审计设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

EF Core 數據變更自動審計設計

Intro

有的時候我們需要知道每個數據表的變更記錄以便做一些數據審計,數據恢復以及數據同步等之類的事情, EF 自帶了對象追蹤,使得我們可以很方便的做一些審計工作,每次變更發生了什么變化都變得很清晰,于是就基于 EF 封裝了一層數據變更自動審計

使用效果

測試代碼:

private static void AutoAuditTest() {// 審計配置AuditConfig.Configure(builder =>{builder// 配置操作用戶獲取方式.WithUserIdProvider(EnvironmentAuditUserIdProvider.Instance.Value)//.WithUnModifiedProperty() // 保存未修改的屬性,默認只保存發生修改的屬性// 保存更多屬性.EnrichWithProperty("MachineName", Environment.MachineName).EnrichWithProperty(nameof(ApplicationHelper.ApplicationName), ApplicationHelper.ApplicationName)// 保存到自定義的存儲.WithStore<AuditFileStore>().WithStore<AuditFileStore>("logs.log")// 忽略指定實體.IgnoreEntity<AuditRecord>()// 忽略指定實體的某個屬性.IgnoreProperty<TestEntity>(t => t.CreatedAt)// 忽略所有屬性名稱為 CreatedAt 的屬性.IgnoreProperty("CreatedAt");});DependencyResolver.TryInvokeService<TestDbContext>(dbContext =>{dbContext.Database.EnsureDeleted();dbContext.Database.EnsureCreated();var testEntity = new TestEntity(){Extra = new { Name = "Tom" }.ToJson(),CreatedAt = DateTimeOffset.UtcNow,};dbContext.TestEntities.Add(testEntity);dbContext.SaveChanges();testEntity.CreatedAt = DateTimeOffset.Now;testEntity.Extra = new { Name = "Jerry" }.ToJson();dbContext.SaveChanges();dbContext.Remove(testEntity);dbContext.SaveChanges();var testEntity1 = new TestEntity(){Extra = new { Name = "Tom1" }.ToJson(),CreatedAt = DateTimeOffset.UtcNow,};dbContext.TestEntities.Add(testEntity1);var testEntity2 = new TestEntity(){Extra = new { Name = "Tom2" }.ToJson(),CreatedAt = DateTimeOffset.UtcNow,};dbContext.TestEntities.Add(testEntity2);dbContext.SaveChanges();});DependencyResolver.TryInvokeService<TestDbContext>(dbContext =>{dbContext.Remove(new TestEntity(){Id = 2});dbContext.SaveChanges();});// disable auditAuditConfig.DisableAudit(); }

查看審計記錄信息:

可以看到,每次數據變更都會被記錄下來, CreatedAt 沒有記錄是因為上面配置的忽略 CreatedAt 屬性信息的記錄。

這里的 TableName ,屬性名稱和 Entity 定義的不同是為了測試列名和屬性名稱不一致的情況,實際記錄的是數據庫里的表名稱和列名稱,之所以這樣設計考慮的是可能多個應用使用同一張表,但是不同的應用里可能使用的 Entity 和 Property 都不同,所以統一使用了數據庫的表名稱和字段名稱。

OperationType是一個枚舉,1是新增,2是刪除,3是修改。

Extra 列對應的就是我們自定義的增加的審計屬性

UpdatedBy 是我們配置的 UserIdProvider 所提供的操作用戶的信息

值得注意的是最后一條變更記錄,這條數據的刪除沒有經過數據庫查詢,直接刪除的,EF 不知道原本的除了主鍵之外的信息,所以記錄的原始信息可能不準確,不過還是知道誰刪除的這一條數據,對比之前的變更還是可以滿足需求的。

實現原理

實現的原理是基于 EF 的內置的 Change Tracking 來實現的,EF 每次 SaveChanges 之前都會檢測變更,每條變更的記錄都會記錄變更前的屬性值以及變更之后的屬性值,因此我們可以在 SaveChanges 之前記錄變更前后的屬性,對于數據庫生成的值,如 SQL Server 里的自增主鍵,在保存之前,屬性的會被標記為 IsTemporary ,保存成功之后會自動更新,在保存之后可以獲取到數據庫生成的值。

實現代碼

首先實現一個 DbContextBase,重寫 SaveChanges 和 SaveChangesAsync 方法,增加

BeforeSaveChanges 和 AfterSaveChanges 方法,用于處理我們要自定義的保存之前和保存之后的邏輯。

public abstract class DbContextBase : DbContext {protected DbContextBase(){}protected DbContextBase(DbContextOptions dbContextOptions) : base(dbContextOptions){}protected virtual Task BeforeSaveChanges() => Task.CompletedTask;protected virtual Task AfterSaveChanges() => Task.CompletedTask;public override int SaveChanges(){BeforeSaveChanges().Wait();var result = base.SaveChanges();AfterSaveChanges().Wait();return result;}public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default){await BeforeSaveChanges();var result = await base.SaveChangesAsync(cancellationToken);await AfterSaveChanges();return result;}

接著來實現一個用來自動審計的 AuditDbContextBase,核心代碼如下:

public abstract class AuditDbContextBase : DbContextBase {protected AuditDbContextBase(){}protected AuditDbContextBase(DbContextOptions dbContextOptions) : base(dbContextOptions){}protected List<AuditEntry> AuditEntries { get; set; }protected override Task BeforeSaveChanges(){AuditEntries = new List<AuditEntry>();foreach (var entityEntry in ChangeTracker.Entries()){if (entityEntry.State == EntityState.Detached || entityEntry.State == EntityState.Unchanged){continue;}AuditEntries.Add(new AuditEntry(entityEntry));}return Task.CompletedTask;}protected override async Task AfterSaveChanges(){if (null != AuditEntries && AuditEntries.Count > 0){foreach (var auditEntry in AuditEntries){// update TemporaryPropertiesif (auditEntry.TemporaryProperties != null && auditEntry.TemporaryProperties.Count > 0){foreach (var temporaryProperty in auditEntry.TemporaryProperties){var colName = temporaryProperty.Metadata.GetColumnName();if (temporaryProperty.Metadata.IsPrimaryKey()){auditEntry.KeyValues[colName] = temporaryProperty.CurrentValue;}switch (auditEntry.OperationType){case OperationType.Add:auditEntry.NewValues[colName] = temporaryProperty.CurrentValue;break;case OperationType.Delete:auditEntry.OriginalValues[colName] = temporaryProperty.OriginalValue;break;case OperationType.Update:auditEntry.OriginalValues[colName] = temporaryProperty.OriginalValue;auditEntry.NewValues[colName] = temporaryProperty.CurrentValue;break;}}// set to nullauditEntry.TemporaryProperties = null;}}// ... save audit entries} }

此時我們已經可以實現自動的審計處理了,但是在實際業務處理的過程中,往往我們還會有更多的需求,

比如上面的實現還沒有加入更新人,不知道是由誰來操作的,有些字段可能不希望被記錄下來,或者有些表不要記錄,還有我們向增加一些自定義的屬性,比如多個應用操作同一個數據庫表的時候我們可能希望記錄下來是哪一個用戶通過哪一個應用來更新的等等,所以之前上面的實現還是不能夠實際應用的,于是我又在上面的基礎上增加了一些配置以及擴展,使得自動審計擴展性更好,可定制性更強。

擴展

UserIdProvider

我們可以通過 UserIdProvider 來實現操作用戶信息的獲取,默認提供兩個實現,定義如下:

public interface IAuditUserIdProvider {string GetUserId(); }

默認實現:

// 獲取 Environment.UserName public class EnvironmentAuditUserIdProvider : IAuditUserIdProvider {private EnvironmentAuditUserIdProvider(){}public static Lazy<EnvironmentAuditUserIdProvider> Instance = new Lazy<EnvironmentAuditUserIdProvider>(() => new EnvironmentAuditUserIdProvider(), true);public string GetUserId() => Environment.UserName; } // 獲取 Thread.CurrentPrincipal.Identity.Name public class ThreadPrincipalUserIdProvider : IAuditUserIdProvider {public static Lazy<ThreadPrincipalUserIdProvider> Instance = new Lazy<ThreadPrincipalUserIdProvider>(() => new ThreadPrincipalUserIdProvider(), true);private ThreadPrincipalUserIdProvider(){}public string GetUserId() => Thread.CurrentPrincipal?.Identity?.Name; }

當然如果是 asp.net core 你也可以實現相應的基于 HttpContext 實現的 UserIdProvider

Filters

基于我們可能希望忽略一些實體或屬性記錄,所以有必要增加 Filter 的記錄

基于實體的 Filter: Func<EntityEntry,bool>

基于屬性的 Filter: Func<EntityEntry,PropertyEntry,bool>

為了使用方便定義了一些擴展方法:

public static IAuditConfigBuilder IgnoreEntity(this IAuditConfigBuilder configBuilder, Type entityType) {configBuilder.WithEntityFilter(entityEntry => entityEntry.Entity.GetType() != entityType);return configBuilder; } public static IAuditConfigBuilder IgnoreEntity<TEntity>(this IAuditConfigBuilder configBuilder) where TEntity : class {configBuilder.WithEntityFilter(entityEntry => entityEntry.Entity.GetType() != typeof(TEntity));return configBuilder; } public static IAuditConfigBuilder IgnoreTable(this IAuditConfigBuilder configBuilder, string tableName) {configBuilder.WithEntityFilter(entityEntry => entityEntry.Metadata.GetTableName() != tableName);return configBuilder; } public static IAuditConfigBuilder WithEntityFilter(this IAuditConfigBuilder configBuilder, Func<EntityEntry, bool> filterFunc) {configBuilder.WithEntityFilter(filterFunc);return configBuilder; } public static IAuditConfigBuilder IgnoreProperty<TEntity>(this IAuditConfigBuilder configBuilder, Expression<Func<TEntity, object>> propertyExpression) where TEntity : class {var propertyName = propertyExpression.GetMemberName();configBuilder.WithPropertyFilter(propertyEntry => propertyEntry.Metadata.Name != propertyName);return configBuilder; } public static IAuditConfigBuilder IgnoreProperty(this IAuditConfigBuilder configBuilder, string propertyName) {configBuilder.WithPropertyFilter(propertyEntry => propertyEntry.Metadata.Name != propertyName);return configBuilder; } public static IAuditConfigBuilder IgnoreColumn(this IAuditConfigBuilder configBuilder, string columnName) {configBuilder.WithPropertyFilter(propertyEntry => propertyEntry.Metadata.GetColumnName() != columnName);return configBuilder; } public static IAuditConfigBuilder IgnoreColumn(this IAuditConfigBuilder configBuilder, string tableName, string columnName) {configBuilder.WithPropertyFilter((entityEntry, propertyEntry) => entityEntry.Metadata.GetTableName() != tableName&& propertyEntry.Metadata.GetColumnName() != columnName);return configBuilder; } public static IAuditConfigBuilder WithPropertyFilter(this IAuditConfigBuilder configBuilder, Func<PropertyEntry, bool> filterFunc) {configBuilder.WithPropertyFilter((entity, prop) => filterFunc.Invoke(prop));return configBuilder; }

IAuditPropertyEnricher

上面由提到有時候我們希望審計記錄能夠記錄更多的信息,需要提供給用戶一些自定義的擴展點,這里的 Enricher 的實現參考了 Serilog 里的做法,我們可以自定義一個 IAuditPropertyEnricher ,來豐富審計的信息,默認提供了 AuditPropertyEnricher,可以支持 key-value 形式的補充信息,實現如下:

public class AuditPropertyEnricher : IAuditPropertyEnricher {private readonly string _propertyName;private readonly Func<AuditEntry, object> _propertyValueFactory;private readonly bool _overwrite;private readonly Func<AuditEntry, bool> _auditPropertyPredict = null;public AuditPropertyEnricher(string propertyName, object propertyValue, bool overwrite = false): this(propertyName, (auditEntry) => propertyValue, overwrite){}public AuditPropertyEnricher(string propertyName, Func<AuditEntry, object> propertyValueFactory, bool overwrite = false): this(propertyName, propertyValueFactory, null, overwrite){}public AuditPropertyEnricher(string propertyName,Func<AuditEntry, object> propertyValueFactory,Func<AuditEntry, bool> auditPropertyPredict,bool overwrite = false){_propertyName = propertyName;_propertyValueFactory = propertyValueFactory;_auditPropertyPredict = auditPropertyPredict;_overwrite = overwrite;}public void Enrich(AuditEntry auditEntry){if (_auditPropertyPredict?.Invoke(auditEntry) != false){auditEntry.WithProperty(_propertyName, _propertyValueFactory, _overwrite);}} }

為了方便使用,提供了一些方便的擴展方法:

public static IAuditConfigBuilder EnrichWithProperty(this IAuditConfigBuilder configBuilder, string propertyName, object value, bool overwrite = false) {configBuilder.WithEnricher(new AuditPropertyEnricher(propertyName, value, overwrite));return configBuilder; } public static IAuditConfigBuilder EnrichWithProperty(this IAuditConfigBuilder configBuilder, string propertyName, Func<AuditEntry> valueFactory, bool overwrite = false) {configBuilder.WithEnricher(new AuditPropertyEnricher(propertyName, valueFactory, overwrite));return configBuilder; } public static IAuditConfigBuilder EnrichWithProperty(this IAuditConfigBuilder configBuilder, string propertyName, object value, Func<AuditEntry, bool> predict, bool overwrite = false) {configBuilder.WithEnricher(new AuditPropertyEnricher(propertyName, e => value, predict, overwrite));return configBuilder; } public static IAuditConfigBuilder EnrichWithProperty(this IAuditConfigBuilder configBuilder, string propertyName, Func<AuditEntry, object> valueFactory, Func<AuditEntry, bool> predict, bool overwrite = false) {configBuilder.WithEnricher(new AuditPropertyEnricher(propertyName, valueFactory, predict, overwrite));return configBuilder; }

IAuditStore

之前的測試都是基于數據庫來的,審計記錄也是放在數據庫里的,有時候可能不希望和原始數據存在一個數據庫里,有時候甚至希望不放在數據庫里,為了實現可以自定義的存儲,提供了一個 IAuditStore 的接口,提供給用戶可以自定義審計信息存儲的可能。

public interface IAuditStore {Task Save(ICollection<AuditEntry> auditEntries); }

使用

DbContext?配置

默認提供了一個 AuditDbContextBase 和 AuditDbContext,他們的區別在于 AuditDbContext 會創建一張 AuditRecords 表,記錄審計信息, AuditDbContextBase 則不會,只會寫配置的存儲。

如果希望提供自動審計的功能,新建 DbContext 的時候需要繼承 AuditDbContext 或 AuditDbContextBase

審計配置

AuditConfig.Configure(builder => {builder// 配置操作用戶獲取方式.WithUserIdProvider(EnvironmentAuditUserIdProvider.Instance.Value)//.WithUnModifiedProperty() // 保存未修改的屬性,默認只保存發生修改的屬性// 保存更多屬性.EnrichWithProperty("MachineName", Environment.MachineName).EnrichWithProperty(nameof(ApplicationHelper.ApplicationName), ApplicationHelper.ApplicationName)// 保存到自定義的存儲.WithStore<AuditFileStore>().WithStore<AuditFileStore>("logs0.txt")// 忽略指定實體.IgnoreEntity<AuditRecord>()// 忽略指定實體的某個屬性.IgnoreProperty<TestEntity>(t => t.CreatedAt)// 忽略所有屬性名稱為 CreatedAt 的屬性.IgnoreProperty("CreatedAt"); });

如果希望暫時禁用審計可以使用 AuditConfig.DisableAudit() 來禁用,之后恢復可以使用 AuditConfig.EnableAudit()

// disable audit AuditConfig.DisableAudit(); // enable audit // AuditConfig.EnableAudit();

More

暫時想到的特性只有這些了,想要更多特性?歡迎 Issue & PR

項目地址:https://github.com/WeihanLi/WeihanLi.EntityFramework

Reference

  • https://www.meziantou.net/entity-framework-core-history-audit-table.htm

  • https://github.com/WeihanLi/WeihanLi.EntityFramework

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的EF Core 数据变更自动审计设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

欧美一级电影片 | 2022久久国产露脸精品国产 | 日韩av中文在线观看 | 国产精品欧美久久久久无广告 | 久久精品视频在线播放 | 日日日操 | 国内精品免费久久影院 | 久久免费看视频 | 欧美污污网站 | 999久久久欧美日韩黑人 | 精品亚洲成a人在线观看 | 久久亚洲人 | 超碰人人干人人 | 婷婷丁香激情 | 中文字幕色婷婷在线视频 | 色99之美女主播在线视频 | 午夜黄色影院 | 在线成人免费电影 | 国产亚洲在线观看 | 日韩久久精品一区二区三区 | 九九九电影免费看 | 国产激情小视频在线观看 | 欧美综合在线视频 | 久久精品美女 | 麻豆视频免费入口 | 欧美日本中文字幕 | 狠狠狠的干 | 九九热中文字幕 | 国产精品乱码久久久 | 欧美日韩一区二区久久 | 人人干狠狠操 | 久草免费在线视频观看 | 黄av资源 | 婷婷国产在线 | 在线观看午夜av | 国产一区在线播放 | 99中文字幕在线观看 | 亚洲在线视频免费观看 | 国产精品一区二区三区观看 | 狠狠插狠狠干 | 日日夜夜狠狠 | 国产精品九九热 | 精品中文字幕在线播放 | 99久久99热这里只有精品 | 高潮毛片无遮挡高清免费 | 中文字幕精品一区二区三区电影 | 日韩欧美一区二区三区免费观看 | 国产精品白虎 | www.伊人网| 久久怡红院| 天天摸日日操 | 97操碰| 在线视频 一区二区 | 国产在线999| 亚洲午夜av| 日韩a在线播放 | 亚洲 欧美 变态 国产 另类 | 91视频在线观看下载 | 色婷久久 | 成人在线免费视频观看 | 午夜视频播放 | 91传媒91久久久 | 好看av在线 | 国产做爰视频 | 国产色婷婷精品综合在线手机播放 | 中文字幕精品在线 | 97超在线 | 天堂在线v | 日本不卡久久 | 毛片永久新网址首页 | 成人91av | 99色亚洲 | 久久精品亚洲综合专区 | 国产精品 9999 | 久久久久久久久久久影院 | 久久免费一 | 9在线观看免费高清完整版 玖玖爱免费视频 | 在线看中文字幕 | 国产剧在线观看片 | 91少妇精拍在线播放 | 久久国产经典 | 国产四虎影院 | 亚洲国产大片 | 精品毛片在线 | 夜夜嗨av色一区二区不卡 | 久久久鲁 | 亚洲一区二区三区在线看 | 激情黄色一级片 | 在线观看中文字幕dvd播放 | 美女久久精品 | 国精产品一二三线999 | 国产精品第10页 | 国产精品美女www爽爽爽视频 | 又色又爽又激情的59视频 | 亚洲精品videossex少妇 | 免费观看v片在线观看 | 国产小视频国产精品 | 精品无人国产偷自产在线 | 久久av电影| 精品亚洲午夜久久久久91 | 国内一级片在线观看 | 国产区精品区 | 久久国产精品久久久久 | 色国产视频 | 亚洲精品在 | 亚洲涩综合| 91成人精品一区在线播放 | 久久视频免费 | 午夜精品福利一区二区三区蜜桃 | 人人玩人人添人人澡超碰 | 久久久精品影视 | 国产精品久久久久久久久久久久冷 | 精品视频网站 | 色婷婷成人网 | 伊人色综合久久天天 | 天天摸天天舔天天操 | 99精品久久久久 | 国产群p | 午夜私人影院 | 亚洲精品国产精品国产 | 国产日韩欧美在线观看 | 亚洲男男gaygay无套同网址 | av中文天堂| 探花视频在线版播放免费观看 | 精品成人在线 | 国产在线观看免费av | 夜夜爽www | 一区二区三区四区五区六区 | 草久久久 | 中文字幕第一页在线vr | 国产在线欧美日韩 | 免费不卡中文字幕视频 | 亚洲在线网址 | 日韩欧美99| 在线成人中文字幕 | 不卡中文字幕在线 | 欧美色精品天天在线观看视频 | 欧美性另类 | 99久久精品免费看国产 | 国产成人黄色片 | 国产中文字幕精品 | 美女黄频免费 | 97成人在线观看视频 | 国产精品一区二区三区在线播放 | 日韩大片在线看 | 欧美在线视频第一页 | 亚洲免费成人av电影 | 国产福利a | 深爱激情综合 | 狠狠黄 | 免费国产在线精品 | 日日摸日日碰 | 99久久9| 久久黄色小说 | 久久激情五月婷婷 | 99色免费 | 2022久久国产露脸精品国产 | 99综合视频 | 国产精品视频999 | 亚洲国产影院av久久久久 | 国产丝袜高跟 | av高清一区二区三区 | 欧美日韩a视频 | 69视频在线| .国产精品成人自产拍在线观看6 | 日日夜夜添 | 日日操天天操狠狠操 | 一区二区不卡在线观看 | 久久国产精品一区二区 | 国产99视频在线观看 | 欧美日韩中文在线视频 | 欧美在线aaa | 在线看一区| 国产夫妻性生活自拍 | 欧洲精品一区二区 | 欧美日韩国产一区二区三区在线观看 | 亚洲综合视频在线观看 | 国产日韩欧美精品在线观看 | 成人在线视频网 | 2021国产精品视频 | 国产精品情侣视频 | 国产一级二级在线观看 | 中文字幕一二三区 | 探花视频免费在线观看 | 九九综合九九 | 久久人人爽人人爽人人片av免费 | 婷婷国产视频 | 在线色网站 | 99热最新地址 | 精品一区精品二区高清 | 国产在线999 | 免费一级片视频 | 天天摸夜夜操 | 色综合天天综合在线视频 | 久久免费看视频 | 国内视频1区 | 精品一二区 | 日韩com | 美女免费视频一区 | 国产v亚洲v | 亚洲黄色片在线 | 黄色小网站在线观看 | 日本字幕网 | 中文字幕 91 | 日本高清中文字幕有码在线 | av看片网 | 99re久久精品国产 | 激情www| 日日夜夜综合网 | 久久爱影视i | 亚洲视频久久久 | 国产精品成人av久久 | 精品一二三四在线 | 精品主播网红福利资源观看 | 91mv.cool在线观看 | www色综合| 一区二区三区在线电影 | 国产精品理论片在线播放 | 欧美成人精品三级在线观看播放 | 在线亚洲成人 | 成人在线播放免费观看 | 亚洲精品日韩在线观看 | 91精品网站在线观看 | 91精品伦理 | 免费v片 | 国产麻豆精品一区二区 | 久久久久久久久久久网站 | 91成人精品一区在线播放69 | 涩av在线 | 国产免费一区二区三区网站免费 | 亚洲视频电影在线 | 亚洲国产一二三 | 久久久久久久久免费 | 992tv又爽又黄的免费视频 | 国产91大片 | 国产精品久久久久av免费 | 五月婷婷在线综合 | 亚洲理论片在线观看 | 亚洲 欧美 91 | 六月丁香在线观看 | 免费在线观看中文字幕 | 在线视频 精品 | 97超级碰碰 | 天天操天天吃 | 91免费的视频在线播放 | 婷婷激情站 | 亚洲国产精品影院 | 激情欧美一区二区免费视频 | 蜜桃视频成人在线观看 | 欧美精品一区二区免费 | 欧美大片www | 色婷婷播放 | 天天色天天射天天干 | 亚洲黄色在线 | 亚洲区精品视频 | 欧美精品一区二区三区四区在线 | 亚洲电影第一页av | 国产第一页福利影院 | 在线观看成年人 | 亚洲视频精选 | 免费久久久久久久 | 国产精品福利视频 | 国产精品剧情 | 成年人黄色在线观看 | 成片免费观看视频大全 | 国产成人av一区二区三区在线观看 | 成人黄色小视频 | 久久久精品国产免费观看同学 | 久久久人 | 欧美激情另类 | 国产精品成人在线观看 | 国产乱老熟视频网88av | 婷婷激情影院 | 天天综合导航 | 天天曰| 在线视频免费观看 | 国产视频在线观看免费 | 中文字幕丝袜美腿 | 日韩最新在线视频 | 欧美色综合天天久久综合精品 | 热久久免费视频精品 | 亚洲人成网站精品片在线观看 | av在线看片 | 亚洲首页| 国产精品99久久久精品免费观看 | 免费日韩视| 青青草在久久免费久久免费 | 99视频这里有精品 | 久草免费电影 | 粉嫩aⅴ一区二区三区 | 午夜国产福利视频 | 成人黄色小说在线观看 | 五月综合色婷婷 | 国产成人久久精品亚洲 | 五月婷婷丁香 | 中文永久字幕 | 久久综合色一综合色88 | 蜜臀av.com | 麻豆91在线观看 | 免费成人在线网站 | 美州a亚洲一视本频v色道 | 久产久精国产品 | 国产第一页福利影院 | 国产精品1区2区3区 久久免费视频7 | 成年人网站免费观看 | 成年人av在线播放 | 国产视频一区二区在线 | 香蕉久草在线 | 天堂va欧美va亚洲va老司机 | 久久久久五月 | 国语自产偷拍精品视频偷 | 亚洲精品tv | 国产精品入口66mio女同 | 久久无码av一区二区三区电影网 | 三级黄色理论片 | 在线中文字母电影观看 | 国产不卡视频在线播放 | 国产大片黄色 | 久久精品中文字幕一区二区三区 | 久久五月婷婷丁香 | 国产免费三级在线观看 | 五月婷婷视频 | 综合网久久 | 国产精品11 | 蜜臀av性久久久久av蜜臀三区 | 在线不卡的av | 在线观看日本韩国电影 | 91aaa在线观看 | 黄色在线观看污 | 欧美日韩国产精品一区二区三区 | 久久男人视频 | 亚洲男男gaygay无套 | 天天天天爱天天躁 | 国产一级淫片在线观看 | 999国产在线| 亚洲综合在线播放 | 伊人丁香 | 亚洲精品视频在线观看视频 | 欧美极度另类性三渗透 | 中文字幕亚洲不卡 | 99在线高清视频在线播放 | 久久久久久久av | 国产一级在线观看视频 | 六月丁香综合 | 三上悠亚一区二区在线观看 | 制服丝袜成人在线 | 国产精品久久久久久69 | aaa亚洲精品一二三区 | 亚洲精品字幕 | 免费网站污 | 久久国产美女视频 | 欧美aa一级片 | 欧美在线视频日韩 | 日日夜夜婷婷 | 精品国产精品久久一区免费式 | 欧美9999 | 欧美一二在线 | 国产精品毛片 | 二区三区在线观看 | 国产精品亚州 | 日韩av成人在线观看 | 久久久www成人免费毛片麻豆 | 黄色免费大全 | 国产在线一卡 | 香蕉久久国产 | 久久电影中文字幕视频 | 青青河边草免费直播 | 国产字幕在线观看 | av不卡中文 | 99热在线精品观看 | 最近免费观看的电影完整版 | 在线观看一区 | av大全在线免费观看 | 欧美少妇xxxxxx | av手机版 | 精品久久久久久综合 | 波多野结衣电影一区二区三区 | 天天操天天色天天 | 99在线观看视频 | 久久成人精品电影 | 久草.com| 999国产| 999抗病毒口服液 | 91超级碰碰 | 午夜久久久久久久久久久 | 99视频在线精品国自产拍免费观看 | 最新亚洲视频 | 一区二区三区不卡在线 | 国产精品 中文在线 | 9999精品 | 久久躁日日躁aaaaxxxx | 久久九九网站 | 久久久久欠精品国产毛片国产毛生 | 国产精品日韩在线 | 亚洲电影一区二区 | 69国产盗摄一区二区三区五区 | 欧美久草网 | 国产日韩欧美精品在线观看 | 亚洲精品在线观看不卡 | 免费日韩电影 | 亚欧日韩av | 国产一级电影 | 国产精品久久久久一区二区三区共 | www.黄色| 久久久精品久久日韩一区综合 | 久久香蕉国产精品麻豆粉嫩av | 国产精品自在线 | 91av资源网| 夜夜操天天操 | 超碰97免费在线 | 精品免费久久久久久 | 夜色.com | 国产老太婆免费交性大片 | 久久综合给合久久狠狠色 | 国产二区电影 | 92国产精品久久久久首页 | 在线观看www视频 | 久久午夜免费观看 | 久久精品综合网 | 最近中文字幕视频完整版 | 超碰在线官网 | 国产精品一区二区电影 | 欧美日本在线观看视频 | 色综合五月 | 99国产精品久久久久老师 | 色婷婷av在线 | 日韩精品视频一二三 | 成年人免费观看在线视频 | 亚洲国产mv | 亚洲在线看 | www.激情五月.com | 国产精品一区二区电影 | 伊人春色电影网 | 中文字幕第一页在线视频 | 日韩免费视频网站 | 亚洲综合色婷婷 | 久久久久一区二区三区 | 久久国产精品免费一区 | 亚洲黄色大片 | 国产99久 | 国产在线观看二区 | 久草视频首页 | 久久99免费观看 | 国精产品999国精产品视频 | 色综合天天干 | 日韩欧美在线高清 | 日韩av成人在线观看 | 天操夜夜操 | 欧美精品v国产精品v日韩精品 | 永久免费观看视频 | 欧美一级免费在线 | 国产精品精品久久久 | 天天操天天添 | 亚洲欧洲精品久久 | 亚州av一区 | 天天操夜夜看 | 成人av网址大全 | 四虎免费在线观看 | 国产主播99 | 在线观看久久久久久 | 久草在线中文888 | 日韩免费在线看 | 国产97av | 一级黄色电影网站 | 国产性天天综合网 | 国产精品美女久久久久久久 | 中文字幕在线观看日本 | 亚洲国产播放 | 国产91免费看 | 日韩精品一区二 | www.五月天 | av大全在线看 | 国产精品原创在线 | 99精品欧美一区二区三区黑人哦 | 亚洲精品videossex少妇 | 欧美性脚交| 免费看一级黄色大全 | 黄色毛片视频免费观看中文 | 日本黄色免费在线观看 | 国产精品综合久久 | 成年人免费电影 | 天天爱天天操天天射 | 在线观看www91 | 国产激情小视频在线观看 | 国产一区二区网址 | 97在线观看免费观看 | 欧美综合干 | 久久艹国产视频 | 91在线麻豆 | 欧美久久久久久久久久久久久 | 欧美精品乱码久久久久久按摩 | 亚洲aⅴ免费在线观看 | 日韩理论在线视频 | 国产真实在线 | 久青草国产在线 | 欧美久久久久 | 亚洲视频久久久 | 国产白浆在线观看 | 玖草影院 | 国产视频在线一区二区 | 热久久视久久精品18亚洲精品 | 狠狠躁夜夜躁人人爽超碰91 | 久久久久久久久久久免费视频 | 日日干精品 | 五月天久久激情 | 96香蕉视频| 国产精品亚洲精品 | 日韩高清免费在线观看 | 亚洲国产福利视频 | 久久精品免费电影 | 久久精品系列 | 激情五月婷婷激情 | 国产成人性色生活片 | 免费一级片久久 | 美女一区网站 | 亚洲成av人片在线观看无 | 青春草视频 | 亚洲精品视频www | 欧美大片aaa | 日精品| 欧美最猛性xxx | 亚洲精品在线视频观看 | 国产一区私人高清影院 | 在线观看黄污 | 国产一区二区精品久久 | 欧美久久99 | 天天综合天天综合 | 蜜桃视频色 | 国产精品一区免费在线观看 | 美女久久久久久 | 国产999| 成人av片免费观看app下载 | 精品一二三四五区 | 国产视频在| 爱情影院aqdy鲁丝片二区 | 成人理论电影 | 中日韩欧美精彩视频 | 日本中文字幕在线一区 | 六月丁香久久 | 涩涩伊人 | 热久久99这里有精品 | 国产不卡在线视频 | 亚洲不卡在线 | 蜜臀aⅴ国产精品久久久国产 | 国产a国产a国产a | 国产精品在线看 | 黄色综合 | 国产区在线看 | 国产a精品 | 在线观看亚洲视频 | 国产不卡在线观看视频 | 国产视频在线免费 | 精品免费视频 | 91精品国产福利在线观看 | 天天操天天射天天插 | 亚洲精品在线二区 | 久久福利 | 波多野结衣在线观看一区 | 在线观看免费观看在线91 | 在线观看精品视频 | 碰超人人 | 高清精品久久 | 日韩视频一区二区 | 91视频在线看 | 深爱五月激情网 | 成人免费 在线播放 | 亚洲国产精品成人综合 | 亚洲乱码精品久久久 | 日韩激情一二三区 | 国产一区二区在线观看免费 | 国内精品久久久精品电影院 | 六月丁香婷 | 国产精品av久久久久久无 | 国产一级免费观看 | 午夜精选视频 | 91在线亚洲 | 午夜123 | 在线不卡中文字幕播放 | www.99av| 日日夜夜国产 | 国产成人av电影在线 | 人人爱夜夜操 | 亚洲精品456在线播放第一页 | 久草在线手机视频 | 久久久久免费精品国产小说色大师 | 成人动漫精品一区二区 | 日日夜夜天天干 | 九九热久久免费视频 | 一级片免费观看 | 久久精美视频 | 天天操天天色天天射 | 中文字幕字幕中文 | 99一级片| 国产免费中文字幕 | 久久综合色婷婷 | 中文字幕精品三级久久久 | 欧美成人理伦片 | 在线草 | 久久免费在线观看 | 久久国产美女 | 日韩欧美精品在线观看视频 | av不卡在线看 | 97视频播放 | 狠狠久久综合 | 在线视频一区二区 | 二区中文字幕 | 免费成人黄色 | 在线小视频 | 免费亚洲婷婷 | 国产中年夫妇高潮精品视频 | 黄色软件网站在线观看 | 日韩一区正在播放 | 日韩视频图片 | av丝袜制服 | 黄网站色欧美视频 | 精品在线你懂的 | www狠狠操 | 国产精品毛片久久 | 欧美一级黄色网 | 91视频在线网址 | 亚洲在线视频播放 | 色资源网免费观看视频 | 久久免费99精品久久久久久 | 国产精选在线观看 | 欧美成年人在线观看 | 久久精品一区二区三区国产主播 | av网站免费在线 | 亚洲欧美综合精品久久成人 | 国产一区二区在线播放视频 | 亚洲永久精品在线观看 | 免费三级av | 久久精品播放 | 欧美综合色 | 天天色天天干天天 | av福利在线免费观看 | 久久久精品电影 | 五月婷婷久 | 综合精品在线 | 欧美巨大 | 免费观看性生交大片3 | 99九九视频| 91麻豆国产 | 欧美久久久久久久久中文字幕 | 99欧美精品 | 欧美va电影 | 夜夜夜夜猛噜噜噜噜噜初音未来 | www.狠狠色 | 丁香六月婷婷开心 | wwxxxx日本| 五月婷婷中文网 | 看国产黄色大片 | 国产99久久久国产精品免费二区 | 五月激情六月丁香 | 女人18精品一区二区三区 | 久久久久久久久精 | 日韩精品短视频 | 黄色性av| 在线观看中文字幕视频 | 超碰九九 | 欧美性直播 | 欧美污在线观看 | 精品国产伦一区二区三区免费 | av电影在线免费 | 久久精品免费电影 | 亚洲日本成人网 | 美女网站视频免费黄 | 97爱爱爱| 99久热精品 | 免费三级黄色片 | 91粉色视频| 亚洲最大成人免费网站 | 亚洲精品综合一区二区 | 国产精品永久在线观看 | 成年人免费看片网站 | 在线免费观看黄色av | 亚洲在线国产 | 麻豆va一区二区三区久久浪 | 久久免费电影网 | 超碰人人av | 日韩午夜在线观看 | 日韩中文字幕在线 | 天天干,天天射,天天操,天天摸 | 香蕉日日| 激情五月婷婷激情 | 99热这里精品 | 国产电影一区二区三区四区 | 亚洲激情一区二区三区 | 96视频在线 | 国产福利电影网址 | 亚洲精品视频在线观看网站 | 久久精品国产一区 | 麻豆视屏 | 国产麻豆视频免费观看 | 香蕉影院在线观看 | 天天操狠狠操 | 婷婷网在线 | 中文字幕丝袜美腿 | 九色91av | 国产看片 色 | av片在线观看 | 久久不卡电影 | av观看在线观看 | 国产精品自产拍在线观看中文 | 伊人色综合久久天天网 | 又黄又爽又湿又无遮挡的在线视频 | 欧美日韩久久 | 日韩综合在线观看 | 国产在线视频一区二区 | 亚洲精品综合久久 | 国产精品久久网 | av久久久| 天天操天天射天天 | 天天天在线综合网 | 国产视频一级 | 91精品啪在线观看国产 | 国产91学生粉嫩喷水 | 免费一级特黄毛大片 | 国产精品一码二码三码在线 | 久久久噜噜噜久久久 | 亚洲女人天堂成人av在线 | 五月天激情综合网 | 中文字幕丝袜美腿 | 国内精品久久久久久久影视简单 | 国产美女网 | 亚洲视屏 | 美女啪啪图片 | 中文字幕国产 | 丁香婷婷在线观看 | 国产色中涩 | 在线有码中文 | 国产精品2020| 91精品久久香蕉国产线看观看 | 久久er99热精品一区二区 | 伊人国产视频 | 国产精品不卡在线 | 美女久久精品 | 国模视频一区二区三区 | av免费观看在线 | 天天干天天干天天 | 国产资源av | 国产xxxx性hd极品 | 久久69精品 | 美女网站视频色 | 51久久成人国产精品麻豆 | 国产中文伊人 | 99久久国产免费,99久久国产免费大片 | 日韩成人免费观看 | 精品久久久久久亚洲综合网站 | 一区二区伦理 | 久久久久日本精品一区二区三区 | 日韩视频专区 | 91欧美国产 | 国产香蕉视频在线观看 | 日韩久久久久久久久久 | 五月婷婷色 | 免费在线观看av网址 | 成人av电影在线观看 | 天天干天天操天天拍 | 天天干天天插伊人网 | 久久1电影院| 伊人狠狠色丁香婷婷综合 | 日韩一区二区三区高清在线观看 | 狠狠狠的干 | 欧美日韩免费看 | 美女一区网站 | 天天干天天在线 | 99精品在线免费 | 一级a毛片高清视频 | 丰满少妇麻豆av | 欧美日韩精品在线视频 | 麻豆视频免费在线播放 | 久久久久久蜜桃一区二区 | 成人免费在线观看电影 | 精品国产成人av | 日韩在线观看一区二区 | 日韩精品一区二区久久 | 97碰碰视频| 欧美色图视频一区 | 久久综合久久综合九色 | 美女网站视频免费都是黄 | 91麻豆精品一区二区三区 | 亚洲 欧洲 国产 日本 综合 | 日韩免费区 | 日韩精品一区二区三区在线视频 | 国产精品久久一卡二卡 | 久久精品毛片 | 国产破处在线视频 | 久久久久久久久久久电影 | 人人草在线视频 | 亚洲精选国产 | 西西444www大胆高清视频 | 午夜av一区二区三区 | 国产网站在线免费观看 | 久久色亚洲| 在线看一区二区 | 亚洲v欧美v国产v在线观看 | 中文字幕4 | 精品国产成人av在线免 | www.色午夜.com | 欧美日韩免费一区 | 久久大香线蕉app | 99久久精品国产一区二区成人 | 久色婷婷| 亚洲精品视频免费在线 | 久久亚洲私人国产精品 | 国产欧美三级 | 西西人体4444www高清视频 | 久久久久久久久久久免费视频 | 欧美成人精品三级在线观看播放 | 日韩高清片 | 91福利国产在线观看 | 一区二区中文字幕在线播放 | 2019久久精品| 天天操人| 久草在线在线精品观看 | 国产视频中文字幕在线观看 | 国产成人av一区二区三区在线观看 | 久久高清国产视频 | 久久99在线视频 | 四虎在线免费观看视频 | 国产在线欧美日韩 | 国内外激情视频 | 中文字幕在线视频一区二区三区 | 高清在线一区 | 亚洲美女免费精品视频在线观看 | 久久96国产精品久久99漫画 | 亚洲深夜影院 | 六月天综合网 | 九九热国产 | 成人精品影视 | 欧美一级大片在线观看 | 欧美日韩视频免费 | 日韩视频一区二区三区在线播放免费观看 | 精品久久久久久久久久 | 狠狠狠色丁香婷婷综合久久88 | 99视频在线观看视频 | 亚洲专区免费观看 | 亚洲精品免费在线观看 | 国产精品国产亚洲精品看不卡15 | 99视频在线免费播放 | 成人三级视频 | 国产高清免费av | 亚洲精品1区2区3区 超碰成人网 | 国产小视频在线看 | www.com久久 | 欧美午夜剧场 | www.97视频 | 国产成人精品一区在线 | 91刺激视频| 国产精品久久久久久久久软件 | 免费观看丰满少妇做爰 | 91久久国产露脸精品国产闺蜜 | 欧美日韩国产一二 | 操一草| 中文字幕在线国产 | 婷婷丁香视频 | 国产日韩精品一区二区 | 91成人在线免费观看 | 色网站在线免费观看 | 国产亚洲精品bv在线观看 | 亚洲黄色在线免费观看 | 日日草天天干 | 亚洲激情电影在线 | 人成在线免费视频 | 综合网天天色 | 亚洲aⅴ一区二区三区 | www.久艹| 2019精品手机国产品在线 | 日韩有码第一页 | 我要色综合天天 | 亚洲精品视频免费观看 | 在线香蕉视频 | 午夜影院一级 | 亚洲91av| 婷婷在线不卡 | 久久97久久97精品免视看 | 欧美亚洲专区 | 在线观看亚洲免费视频 | 日韩剧情 | www.五月婷 | 国产精品久久在线观看 | 97超碰人人澡人人爱学生 | 日本在线中文 | 99久久影院 | 亚洲精品短视频 | 99视频精品免费观看, | 99福利片| 国产 字幕 制服 中文 在线 | 成人av免费播放 | 国产精品激情偷乱一区二区∴ | 精品91久久久久 | 国产电影黄色av | 久久99日韩 | 久久久久久网址 | 日日夜夜91 | 精品久久久免费 | 国产精品久久久久久久久久99 | 在线观看av不卡 | 国产视频 亚洲精品 | 黄影院| 狂野欧美激情性xxxx欧美 | 欧美aa级 | 久久久久激情电影 | 色国产精品一区在线观看 | 一个色综合网站 | 国产精品国产自产拍高清av | 最新不卡av| 国产伦精品一区二区三区照片91 | 91精品爽啪蜜夜国产在线播放 | 色综久久 | 国产精品丝袜久久久久久久不卡 | 午夜成人免费影院 | 精品国产伦一区二区三区免费 | 99热在线免费观看 | 91精品视频免费观看 | 欧美日韩国产精品一区二区亚洲 | 天天操人人干 | 午夜日b视频 | 成人一区二区在线观看 | 免费日韩 精品中文字幕视频在线 | 色综合久久久久久久久五月 | 粉嫩av一区二区三区四区五区 | 国产精品一区二区久久久 | 中文字幕五区 | 99视频偷窥在线精品国自产拍 | av大片网址 | 久久99在线视频 | 国产成人亚洲在线电影 | 国产精品区免费视频 | 五月色综合 | 最近中文字幕mv免费高清在线 | 麻豆影视在线播放 | 亚洲jizzjizz日本少妇 | 欧洲视频一区 | 久久国产成人午夜av影院潦草 | 欧美激情视频一区 | 亚洲 欧美日韩 国产 中文 | 色99久久| 福利一区二区三区四区 | 成人羞羞视频在线观看免费 | 国产亚洲片 | 啪啪激情网 | 国产小视频网站 | 欧美一区二区三区四区夜夜大片 | 亚洲精品女人久久久 | 久久婷亚洲五月一区天天躁 | www.成人精品 | 视频精品一区二区三区 | 日韩三级.com | 超碰在线最新网址 | 久久久久在线观看 | 日韩电影中文字幕在线 | 欧美亚洲一区二区在线 | 免费看黄在线观看 | 狠狠干狠狠操 | 国产精品欧美日韩在线观看 | 国产婷婷色 | 国产成人99久久亚洲综合精品 | 欧美在线久久 | 国产精品久久嫩一区二区免费 | 国产精品欧美久久久久久 | 国产精品福利午夜在线观看 | 欧美日韩在线网站 | 久久久www成人免费精品 | 久草在线免费在线观看 | 亚洲成色777777在线观看影院 | 99在线热播精品免费99热 | 国产区av在线 | 日本系列中文字幕 | 亚洲欧洲视频 | 亚洲最快最全在线视频 | 91在线视频播放 | 欧美精品一区二区三区四区在线 | 中文字幕a∨在线乱码免费看 | 中文字幕在线观看免费 | 蜜臀91丨九色丨蝌蚪老版 | 久久精品国产v日韩v亚洲 | 国产又粗又猛又黄又爽 | 中文字幕在线看人 | 久草在线免| 日韩精品一卡 | 人人看人人爱 | 五月婷婷影院 | 99久久er热在这里只有精品66 | 亚洲国产大片 | 97超碰中文字幕 | 久久综合毛片 | 亚洲国产成人精品电影在线观看 | 久久国产精品99久久久久久进口 | 视频福利在线观看 | 欧美一级性生活 | 亚洲精品免费播放 | 九九久久精品视频 | 久久久人人人 | 天天干天天射天天插 | 91激情小视频 | 亚洲人天堂| 一级黄色在线免费观看 |