调教肉文小说-国产成本人片免费av-空姐av种子无码-在线观看免费午夜视频-综合久久精品激情-国产成人丝袜视频在线观看软件-大芭区三区四区无码-啊啊好爽啊啊插啊用力啊啊-wanch视频网-国产精品成人a免费观看


標(biāo)題:從零開始實現(xiàn)ASP.NET Core MVC的插件式開發(fā)(四) - 插件安裝
作者:Lamond Lu
地址:https://www.cnblogs.com/lwqlun/p/11343141.html
<https://www.cnblogs.com/lwqlun/p/11343141.html>
源代碼:https://github.com/lamondlu/DynamicPlugins
<https://github.com/lamondlu/DynamicPlugins>



前情回顧

* 從零開始實現(xiàn)ASP.NET Core MVC的插件式開發(fā)(一) - 使用Application Part動態(tài)加載控制器和視圖
<https://www.cnblogs.com/lwqlun/p/11137788.html#4310745>
* 從零開始實現(xiàn)ASP.NET Core MVC的插件式開發(fā)(二) - 如何創(chuàng)建項目模板
<https://www.cnblogs.com/lwqlun/p/11155666.html>
* 從零開始實現(xiàn)ASP.NET Core MVC的插件式開發(fā)(三) - 如何在運行時啟用組件
<https://www.cnblogs.com/lwqlun/p/11260750.html>
上一篇中,我們針對運行時啟用/禁用組件做了一些嘗試,最終我們發(fā)現(xiàn)借助IActionDescriptorChangeProvider
可以幫助我們實現(xiàn)所需的功能。本篇呢,我們就來繼續(xù)研究如何完成插件的安裝,畢竟之前的組件都是我們預(yù)先放到主程序中的,這樣并不是一種很好的安裝插件方式。

準(zhǔn)備階段

創(chuàng)建數(shù)據(jù)庫

為了完成插件的安裝,我們首先需要為主程序創(chuàng)建一個數(shù)據(jù)庫,來保存插件信息。 這里為了簡化邏輯,我只創(chuàng)建了2個表,Plugins表是用來記錄插件信息的,
PluginMigrations表是用來記錄插件每個版本的升級和降級腳本的。




設(shè)計說明:這里我的設(shè)計是將所有插件使用的數(shù)據(jù)庫表結(jié)構(gòu)都安裝在主程序的數(shù)據(jù)庫中,暫時不考慮不同插件的數(shù)據(jù)庫表結(jié)構(gòu)沖突,也不考慮插件升降級腳本的破壞性操作檢查,所以有類似問題的小伙伴可以先假設(shè)插件之間的表結(jié)構(gòu)沒有沖突,插件遷移腳本中也不會包含破壞主程序所需系統(tǒng)表的問題。

備注:數(shù)據(jù)庫腳本可查看源代碼的DynamicPlugins.Database項目

創(chuàng)建一個安裝包

為了模擬安裝的效果,我決定將插件做成插件壓縮包,所以需要將之前的DemoPlugin1項目編譯后的文件以及一個plugin.json
文件打包。安裝包的內(nèi)容如下:

這里暫時使用手動的方式來實現(xiàn),后面我會創(chuàng)建一個Global Tools來完成這個操作。



在plugin.json文件中記錄當(dāng)前插件的一些元信息,例如插件名稱,版本等。
{ "name": "DemoPlugin1", "uniqueKey": "DemoPlugin1", "displayName":"Lamond
Test Plugin1", "version": "1.0.0" }
編碼階段

在創(chuàng)建完插件安裝包,并完成數(shù)據(jù)庫準(zhǔn)備操作之后,我們就可以開始編碼了。

抽象插件邏輯

為了項目擴展,我們需要針對當(dāng)前業(yè)務(wù)進(jìn)行一些抽象和建模。

創(chuàng)建插件接口和插件基類

首先我們需要將插件的概念抽象出來,所以這里我們首先定義一個插件接口IModule以及一個通用的插件基類ModuleBase。

IModule.cs
public interface IModule { string Name { get; } DomainModel.Version Version {
get; } }
在IModule接口中我們定義了當(dāng)前插件的名稱和插件的版本號。

ModuleBase.cs
public class ModuleBase : IModule { public ModuleBase(string name) { Name =
name; Version = "1.0.0"; } public ModuleBase(string name, string version) {
Name = name; Version = version; } public ModuleBase(string name, Version
version) { Name = name; Version = version; } public string Name { get; private
set; } public Version Version { get; private set; } }
ModuleBase類實現(xiàn)了IModule接口,并進(jìn)行了一些初始化的操作。后續(xù)的插件類都需要繼承ModuleBase類。

解析插件配置

為了完成插件包的解析,這里我創(chuàng)建了一個PluginPackage類,其中封裝了插件包的相關(guān)操作。
public class PluginPackage { private PluginConfiguration _pluginConfiguration
= null; private Stream _zipStream = null; private string _folderName =
string.Empty; public PluginConfiguration Configuration { get { return
_pluginConfiguration; } } public PluginPackage(Stream stream) { _zipStream =
stream; Initialize(stream); } public List<IMigration> GetAllMigrations(string
connectionString) { var assembly =
Assembly.LoadFile($"{_folderName}/{_pluginConfiguration.Name}.dll"); var
dbHelper = new DbHelper(connectionString); var migrationTypes =
assembly.ExportedTypes.Where(p =>
p.GetInterfaces().Contains(typeof(IMigration))); List<IMigration> migrations =
new List<IMigration>(); foreach (var migrationType in migrationTypes) { var
constructor = migrationType.GetConstructors().First(p =>
p.GetParameters().Count() == 1 && p.GetParameters()[0].ParameterType ==
typeof(DbHelper)); migrations.Add((IMigration)constructor.Invoke(new object[] {
dbHelper })); } assembly = null; return migrations.OrderBy(p =>
p.Version).ToList(); } public void Initialize(Stream stream) { var
tempFolderName = $"{ AppDomain.CurrentDomain.BaseDirectory }{
Guid.NewGuid().ToString()}"; ZipTool archive = new ZipTool(stream,
ZipArchiveMode.Read); archive.ExtractToDirectory(tempFolderName); var folder =
new DirectoryInfo(tempFolderName); var files = folder.GetFiles(); var
configFiles = files.Where(p => p.Name == "plugin.json"); if
(!configFiles.Any()) { throw new Exception("The plugin is missing the
configuration file."); } else { using (var s = configFiles.First().OpenRead())
{ LoadConfiguration(s); } } folder.Delete(true); _folderName =
$"{AppDomain.CurrentDomain.BaseDirectory}Modules\\{_pluginConfiguration.Name}";
if (Directory.Exists(_folderName)) { throw new Exception("The plugin has been
existed."); } stream.Position = 0; archive.ExtractToDirectory(_folderName); }
private void LoadConfiguration(Stream stream) { using (var sr = new
StreamReader(stream)) { var content = sr.ReadToEnd(); _pluginConfiguration =
JsonConvert.DeserializeObject<PluginConfiguration>(content); if
(_pluginConfiguration == null) { throw new Exception("The configuration file is
wrong format."); } } } }
代碼解釋:

* 這里在Initialize方法中我使用了ZipTool類來進(jìn)行解壓縮,解壓縮之后,程序會嘗試讀取臨時解壓目錄中的plugin.json
文件,如果文件不存在,就會報出異常。
* 如果主程序中沒有當(dāng)前插件,就會解壓到定義好的插件目錄中。(這里暫時不考慮插件升級,下一篇中會做進(jìn)一步說明)
* GetAllMigrations方法的作用是從程序集中加載當(dāng)前插件所有的遷移腳本。
新增腳本遷移功能

為了讓插件在安裝時,自動實現(xiàn)數(shù)據(jù)庫表的創(chuàng)建,這里我還添加了一個腳本遷移機制,這個機制類似于EF的腳本遷移,以及之前分享過的FluentMigrator遷移。

這里我們定義了一個遷移接口IMigration, 并在其中定義了2個接口方法MigrationUp和MigrationDown來完成插件升級和降級的功能。
public interface IMigration { DomainModel.Version Version { get; } void
MigrationUp(Guid pluginId); void MigrationDown(Guid pluginId); }
然后我們實現(xiàn)了一個遷移腳本基類BaseMigration
public abstract class BaseMigration : IMigration { private Version _version =
null; private DbHelper _dbHelper = null; public BaseMigration(DbHelper
dbHelper, Version version) { this._version = version; this._dbHelper =
dbHelper; } public Version Version { get { return _version; } } protected void
SQL(string sql) { _dbHelper.ExecuteNonQuery(sql); } public abstract void
MigrationDown(Guid pluginId); public abstract void MigrationUp(Guid pluginId);
protected void RemoveMigrationScripts(Guid pluginId) { var sql = "DELETE
PluginMigrations WHERE PluginId = @pluginId AND Version = @version";
_dbHelper.ExecuteNonQuery(sql, new List<SqlParameter> { new SqlParameter{
ParameterName = "@pluginId", SqlDbType = SqlDbType.UniqueIdentifier, Value =
pluginId }, new SqlParameter{ ParameterName = "@version", SqlDbType =
SqlDbType.NVarChar, Value = _version.VersionNumber } }.ToArray()); } protected
void WriteMigrationScripts(Guid pluginId, string up, string down) { var sql =
"INSERT INTO PluginMigrations(PluginMigrationId, PluginId, Version, Up, Down)
VALUES(@pluginMigrationId, @pluginId, @version, @up, @down)";
_dbHelper.ExecuteNonQuery(sql, new List<SqlParameter> { new SqlParameter{
ParameterName = "@pluginMigrationId", SqlDbType = SqlDbType.UniqueIdentifier,
Value = Guid.NewGuid() }, new SqlParameter{ ParameterName = "@pluginId",
SqlDbType = SqlDbType.UniqueIdentifier, Value = pluginId }, new SqlParameter{
ParameterName = "@version", SqlDbType = SqlDbType.NVarChar, Value =
_version.VersionNumber }, new SqlParameter{ ParameterName = "@up", SqlDbType =
SqlDbType.NVarChar, Value = up}, new SqlParameter{ ParameterName = "@down",
SqlDbType = SqlDbType.NVarChar, Value = down} }.ToArray()); } }
代碼解釋

* 這里的WriteMigrationScripts和RemoveMigrationScripts
的作用是用來將插件升級和降級的遷移腳本的保存到數(shù)據(jù)庫中。因為我并不想每一次都通過加載程序集的方式讀取遷移腳本,所以這里在安裝插件時,我會將每個插件版本的遷移腳本導(dǎo)入到數(shù)據(jù)庫中。
* SQL方法是用來運行遷移腳本的,這里為了簡化代碼,缺少了事務(wù)處理,有興趣的同學(xué)可以自行添加。
為之前的腳本添加遷移程序

這里我們假設(shè)安裝DemoPlugin1插件1.0.0版本之后,需要在主程序的數(shù)據(jù)庫中添加一個名為Test的表。

根據(jù)以上需求,我添加了一個初始的腳本遷移類Migration.1.0.0.cs, 它繼承了BaseMigration類。
public class Migration_1_0_0 : BaseMigration { private static
DynamicPlugins.Core.DomainModel.Version _version = new
DynamicPlugins.Core.DomainModel.Version("1.0.0"); private static string
_upScripts = @"CREATE TABLE [dbo].[Test]( TestId[uniqueidentifier] NOT NULL,
);"; private static string _downScripts = @"DROP TABLE [dbo].[Test]"; public
Migration_1_0_0(DbHelper dbHelper) : base(dbHelper, _version) { } public
DynamicPlugins.Core.DomainModel.Version Version { get { return _version; } }
public override void MigrationDown(Guid pluginId) { SQL(_downScripts);
base.RemoveMigrationScripts(pluginId); } public override void MigrationUp(Guid
pluginId) { SQL(_upScripts); base.WriteMigrationScripts(pluginId, _upScripts,
_downScripts); } }
代碼解釋:

* 這里我們通過實現(xiàn)MigrationUp和MigrationDown
方法來完成新表的創(chuàng)建和刪除,當(dāng)然本文只實現(xiàn)了插件的安裝,并不涉及刪除或降級,這部分代碼在后續(xù)文章中會被使用。
* 這里注意在運行升級腳本之后,會將當(dāng)前插件版本的升降級腳本通過base.WriteMigrationScripts方法保存到數(shù)據(jù)庫。
添加安裝插件包的業(yè)務(wù)處理類

為了完成插件包的安裝邏輯,這里我創(chuàng)建了一個PluginManager類, 其中AddPlugins方法使用來進(jìn)行插件安裝的。
public void AddPlugins(PluginPackage pluginPackage) { var plugin = new
DTOs.AddPluginDTO { Name = pluginPackage.Configuration.Name, DisplayName =
pluginPackage.Configuration.DisplayName, PluginId = Guid.NewGuid(), UniqueKey =
pluginPackage.Configuration.UniqueKey, Version =
pluginPackage.Configuration.Version };
_unitOfWork.PluginRepository.AddPlugin(plugin); _unitOfWork.Commit(); var
versions = pluginPackage.GetAllMigrations(_connectionString); foreach (var
version in versions) { version.MigrationUp(plugin.PluginId); } }
代碼解釋

* 方法簽名中的pluginPackage即包含了插件包的所有信息
* 這里我們首先將插件的信息,通過工作單元保存到了數(shù)據(jù)庫
* 保存成功之后,我通過pluginPackage對象,獲取了當(dāng)前插件包中所包含的所有遷移腳本,并依次運行這些腳本來完成數(shù)據(jù)庫的遷移。
在主站點中添加插件管理界面


這里為了管理插件,我在主站點中創(chuàng)建了2個新頁面,插件列表頁以及添加新插件頁面。這2個頁面的功能非常的簡單,這里我就不進(jìn)一步介紹了,大部分的處理都是復(fù)用了之前的代碼,例如插件的安裝,啟用和禁用,相關(guān)的代碼大家可以自行查看。




設(shè)置已安裝插件默認(rèn)啟動

在完成2個插件管理頁面之后,最后一步,我們還需要做的就是在注程序啟動階段,將已安裝的插件加載到運行時,并啟用。
public void ConfigureServices(IServiceCollection services) { ... var provider
= services.BuildServiceProvider(); using (var scope = provider.CreateScope()) {
var unitOfWork = scope.ServiceProvider.GetService<IUnitOfWork>(); var
allEnabledPlugins = unitOfWork.PluginRepository.GetAllEnabledPlugins(); foreach
(var plugin in allEnabledPlugins) { var moduleName = plugin.Name; var assembly
=
Assembly.LoadFile($"{AppDomain.CurrentDomain.BaseDirectory}Modules\\{moduleName}\\{moduleName}.dll");
var controllerAssemblyPart = new AssemblyPart(assembly);
mvcBuilders.PartManager.ApplicationParts.Add(controllerAssemblyPart); } } }
設(shè)置完成之后,整個插件的安裝編碼就告一段落了。

最終效果



總結(jié)以及待解決的問題


本篇中,我給大家分享了如果將打包的插件安裝到系統(tǒng)中,并完成對應(yīng)的腳本遷移。不過在本篇中,我們只完成了插件的安裝,針對插件的刪除,以及插件的升降級我們還未解決,有興趣的同學(xué),可以自行嘗試一下,你會發(fā)現(xiàn)在.NET
Core 2.2版本,我們沒有任何在運行時Unload程序集能力,所以在從下一篇開始,我將把當(dāng)前項目的開發(fā)環(huán)境升級到.NET Core 3.0
Preview, 針對插件的刪除和升降級我將在.NET Core 3.0中給大家演示。

友情鏈接
ioDraw流程圖
API參考文檔
OK工具箱
云服務(wù)器優(yōu)惠
阿里云優(yōu)惠券
騰訊云優(yōu)惠券
京東云優(yōu)惠券
站點信息
問題反饋
郵箱:[email protected]
QQ群:637538335
關(guān)注微信

感谢您访问我们的网站,您可能还对以下资源感兴趣:

调教肉文小说-国产成本人片免费av-空姐av种子无码-在线观看免费午夜视频-综合久久精品激情-国产成人丝袜视频在线观看软件-大芭区三区四区无码-啊啊好爽啊啊插啊用力啊啊-wanch视频网-国产精品成人a免费观看 精品一区二区三区四| 免费看黄色视频| 日韩V| 玖玖激情| 欧美操逼在线观看| 少妇高潮日韩| 亚洲日韩在线看| 国产欧美精品AAAAAA片| 国产18女人水真多免费看| 无码视频免费观看| www.蜜桃| 中文字幕不卡+婷婷五月| 久久99热这里只频精品6学生| 无码国产一区二区三区四区五区| 韩国人妻无码| 国产在线视频网站| 免费作爱视频| 91涩| 亚洲熟妇AV日韩熟妇在线| 2019中文字幕mv第三季歌词 | 黄片在线视频| 91九色口爆吞精| 婷婷久久综| 大伊人久久| 能看的AV网站| 老熟妇一区二区三区啪啪| 夜夜爱视频| 国产中文字幕第一页| 大香蕉99热| 日本成人免费电影| 亚洲一区二区三区免费视频| 在线成人小视频| 福利视频网亚洲| www.尤物| 激情五月天婷婷| 亚洲一级二级| 91精品又粗又猛又爽| 中文字幕一区二区三区四区| 日韩成人视频在线观看| 成人免费毛片AAAAAA片| 日本无码一区二区三区| 一级理论片| 在线观看欧美日韩| 三级久久久| 日韩无码免费播放| 西西西444www无码视| 国产一级婬片A片免费无成人黑豆| wwwsesese| 天天躁日日躁狠狠| 亚洲欧美成人在线观看| 美日韩一区二区三区| 天天射夜夜操| 熟妇人妻中文| 麻豆一区二区三区四区| 在线18禁| 国产精品婷婷午夜在线观看| 成人网站免费视频| 91精品人妻少妇无码影院| 欧美在线日韩| 在线黄色AV| 九九精品视频在线播放| AV网站免费看| 大鸡巴操骚逼视频| 久久男人天堂| 五月丁香伊人| 婷婷日韩一区二区三区| 亚洲天天操| 精品无码一区二区三区爱与| 日韩中文视频| 国产性交网站| 成人做爰100部片视频| 激情乱伦网| 大地资源第三页在线观看免费播放最新| 久久人妻无码| 爱逼爱操| 国产无限资源| 日韩日批| 国产性色AV| 精品国产va久久久久久久| 日韩免费精品视频| 91黄色视频在线播放| 久草资源在线观看| AV无码免费一区二区三区不卡 | 日韩三级网| 熟妇人妻中文| 免费手机av| www.777av| 亚洲AV激情无码专区在线播放| 成人黄网免费观看视频| 精品偷拍视频| 日韩日逼视频| 成人黄色在线| 人人摸人人看| 一区二区三区精品婷婷| 久久久人妻无码精品蜜桃| 欧美激情性爱网站| av日韩在线播放| 亚洲香蕉视频网站| A片视频播放| 激情综合网站| 亚洲AV无一区二区三区久久| 91精品国产麻豆国产自产在线 | 香蕉操逼小视频| 中文字幕88页| 亚洲xxxxxx| 免费尻屄视频| 亚洲男人天堂视频| 欧美精产国品一区二区区别| 97国产免费| 国产精品久久久久毛片SUV| 国内自拍无码| 色综合天天综合成人网| 天天操天天撸| 亚洲国产精品久久人人爱| 成人欧美大片黄18| 久久v| 91精品视频在线| 一本色道88久久加勒比精品| 国产国产国产在线无码视频| 西西888WWW大胆视频| 综合色五月| 在线观看亚洲中文字幕| 国产一级婬乱A片| 韩国成人无码| 性无码一区二区三区在线观看| 91精品久久久久久久久久| 日本天堂网站| 天天插在线视频| 欧美城综合在线观看网| 无套免费视频欧美| 精品一区二区三区av| 先锋久久资源| 欧美性爱第四页| 久久99视频免费观看| 人人操人人看人人| 国产又爽又黄视频在线看| 猛男大粗猛爽H男人味| 欧美亚洲操逼视频| 午夜老司机福利| 一本久道综合| 人人操97| 国产小电影在线观看| 日韩久久网站| 一级内射视频| 99视频在线观看免费| 日韩av免费在线观看| 一级A片免费观看| 东京热免费视频| 狼人伊人综合| 级婬片AAAAAAA免费| 国产欧美日韩一区| 99日韩精品| 色天使av| 欧美视频二区| 久久久久久国产精品| 成人三级AV在线| 夜夜夜夜骑| 欧美日韩高清丝袜| 俺去也www俺去也com| 密臀久久| 蜜桃视频网站18| 成人精品在线视频| 欧美曰皮免费看| 国产一级黄色毛片| 亚洲第一黄色视频| 最新中文字幕在线观看视频| 国产A片免费观看| 99在线视频免费观看| 国产精品黄色| 东京亚洲无码| 成人一区二区在线观看| 欧美后门菊门交3p| 天天日天天干天天干| 五月婷婷欧美| 亚洲最大三级片| 日韩AV手机在线观看| 好男人WWW社区在线视频夜恋| 欧美亚洲成人电影| 欧美淫乱视频| 欧美一区二区在线| 亚洲乱码国产乱码精品天美传媒| 在线观看成人三级片| 日本色情视频网站| 女人BBBB| 草莓av| 国产成人精品免高潮在线人与禽一| 国产XXXXX| 国产激情无码| 手机看片福利视频| 日本黄色色情视频| 亚洲欧洲综合| 天天操天| 久久精品视频久久| 秋霞丝鲁片一区二区三区手机在绒免| 三级无码片| 中国老女人操逼视频| 青青草手机在线视频| 日韩视频免费看| 秋霞丝鲁片一区二区三区手机在绒免 | 亚洲黄片大全| www.狠狠| 免费黄色大片网站| 特级西西444www大胆高清图片| 亚洲AV成人一区二区三区不卡 | 不卡的av| 美女大吊,网站视频| 五月天丁香婷婷视频| 在线播放高清无码| 青青草手机在线观看| 日韩乱伦电影| 大香蕉av一区二区三区在线观看 | 日韩有码第一页| 99免费视频| 六月综合激情| 欧美伊人在线| 亚洲天堂无码在线观看| 热久久亚洲中文字幕| 91官网在线观看| 黄色草逼视频| av无码在线播放| 四虎Av| 国产三级性爱视频| 少妇搡BBBB搡BBB搡造水多| 天天插天天干| 91成人综合| 日韩无码AV一区二区三区| 亚洲免费观看高清完整版在线| 中文字幕性爱| 国产又大又粗又爽| 日韩精品无码AV| 97精品国产97久久久久久免费| 热99| 欧美亚洲成人网站| 日本爱爱免费播放视频| 小视频+福利| 欧美性交一区二区| 2018天天日天天操| 一道本高清无码视频| 欧美成人视频在线观看| 国产免费性爱视频| 强奸乱伦五月天| 久久久婷婷婷| 国产免费成人在线观看| 色色色热| 高清免费无码视频| 2014亚洲天堂| 成人免费网站在线观看| 日本超碰在线| 国产黄h| 91久久无码一区人妻A片蜜桃 | a√天堂中文在线8| 亚洲无码专区在线| 激情无码网站| 永久AV免费网站| 亲子乱一区二区三区视频| 韩日黄色| H网站在线观看| 打炮影院| 夜色321| 国产精品不卡在线| 国产黄色网页| 日本欧美一级片| 在线网址你懂的| 久久精品视频在线观看| 作爱免费视频| 一级a一级a爰片免费| 激情五月综合网| 亚洲成人77777| 波多野结衣日韩| 日韩av在线免费观看| 日日操天天操| av在线直播| 日韩综合| 操逼视频一级| 日本激情网| 欧美一级AAA大片免费观看| 真人BBwBBWBBw另类视频| 日本A片视频| 亚洲AAA电影| 偷拍精品视频| 91人人| www.操逼网| 波多野结衣在线网站| 亚洲一区欧美二区gay| 老鸭窝成人视频| 国产一级a毛一级做a爱| 丁香花中文字幕| 91色秘乱码一区二区| 国产传媒在线观看| 大香蕉电影网站| 丁香婷婷五月色成人网站| 永井玛丽亚av无码中出流出| 国产熟女av| 欧美手机在线视频| 91精品91久久久中77777| 欧美va在线| 久久久久久91香蕉国产| 伊人久久精品| 欧美成人大香蕉| 中文字幕网站在线观看| 蜜臀99久久精品久久久懂爱| AV黄片| 91无码精品国产AⅤ| 视色网| AV1区二区| 人人看人人摸人人搞| 九九99久久| 日日久视频| 六月激情婷婷| 苍井空精毛片精品久久久| 日本A片在线播放| 人妻少妇偷人精品无码免费| 这里只有精品视频在线| 囯产精品宾馆在线精品酒店| 男人的天堂色琪琪| 小黄片免费在线观看| 69成人精品视频| 在线看一区| 99免费视频| 黄色a片视频| www.俺去也| 999福利视频| 西西444www无码精品| 成人黄片在线免费观看| 久久黄色免费视频| 天天色伊人| 欧美日韩黄色片| 午夜福利高清在线观看| 国产21区| 午夜视频福利| 国产在线1| 国产女人18毛片水真多18精品| A片久久| 国产操比| 欧美在线观看一区二区| 婷婷五月天小说| A片在线免费播放| 国产秘精品一区二区三区免费 | 亚洲综合免费观看高清完整版在线观| 成人久久网| 三级无码AV| 欧一美一色一伦一A片| 久久人妻免费视频| 奇米97| 色色免费黄色视频| 日韩亚洲天堂| a片在线电影网| 逼逼网| 欧美一区二区三区激情| 蜜桃AV无码一区二区三区| 黑人操逼| 欧美亚洲成人视频| 中文字幕在线观看辣文| 处破女初破全过免费看| 国产日逼视频| 上海熟妇搡BBBB搡BBBB| 亚洲天堂在线观看视频| a片免费在线| 玖玖爱AV| 国产不卡视频| 成人黄网在线观看| 色逼综合| 亚洲成人第一网站| 国产精品秘麻豆免费版现看视频| 天天干少妇| 五月天狠狠操| 99视频+国产日韩欧美| 日韩欧美在线免费观看| 一本色道久久综合无码人妻四虎 | 激情一一区二区三区| 亚洲一区二区AV| 青草午夜| 国产主播在线播放| 亚洲成人第一网站| 成人做爰黄A片免费看直播室动漫| 黄片WWW| 国产图区| 九七AV| 国产在线激情| 在线观看老湿视频福利| 国产熟女一区二区久久| 国产h在线| 1024国产在线| 天天日天天射天天操| 国产精品无码不卡| 亚洲无码视频免费看| 少妇做爱特级AAA| 午夜激情视频| 五月天婷婷黄色| 久久狠| 国产成人无码AⅤ片免费播放| 青娱乐偷窥成| 中文字幕不卡视频| 国产精品毛片VA一区二区三区| 美女黄色视频网站| 在线视频观看一区| 国产黄色网| 亚洲视频无码在线| 亚洲AV无码第一区二区三区蜜桃 | 欧美三级推荐| 日本一本视频| 91精品国产综合久久蜜臀使用方法| 3D精品啪啪一区二区三区| www.91麻豆| 操操操综合| 亚洲AV无码乱码精品| 免费国产A片| 婷婷成人五月天| 中文字幕免费高清在线观看| 国产内射久久| 激情黄色五月天| 狠狠干婷婷| 日本久久婷婷| 岛国av在线播放| 天天操欧美| 成人高清无码| 午夜黄色小视频| 91ThePorn国产| 拍拍视频| 日韩中文字幕免费在线观看| se99av| 91精品国产偷窥一区二区| 人人操97| 成人黄色免费| 91无码AⅤ在线| 亚洲中文字幕日本| 狠狠亚洲| 一本到在线视频| 欧美日韩四区| 79色色| 特黄色视频| 毛片69| 国产乱国产乱300精品| 成人福利电影| 亚洲成人一区二区在线观看| 小黄片免费在线观看| 久久五月亭亭| 天天影视综合网免费观看电视剧国产| 激情人妻AV| 欧洲精品在线免费观看| 亚洲热视频| 成人久久久久一级大黄毛片中国 | 囯产精品一区二区三区AV做线| 国产黄片视频| 男人天堂色| 人人摸人人爱人人操| 老女人操逼| 97视频在线观看免费| 成人精品一区二区无码| 国精产品一区一区三区四区| 五月婷久久| 亚洲第一成年人网站| www一个人免费观看视频www| 91视频免费播放| 综合久久视频| 日逼片| 手机看片1204| 超碰操一操| 一级操逼视频免费观看| 亚洲一区在线播放| 亚洲AV秘成人久久无码海归| 精品人妻一区二区乱码一区二区| 九九九成人网| AV四虎| 精品中文一区二区三区| 性爱乱伦视频| 欧美激情无码一区二区三区张丽| 一级片电影网站| 五月天婷婷激情| 大肉大捧一出免费观看| 激情无码在线观看| 亚洲操逼无码| 丰满欧美熟妇免费视频| 露脸老熟女91集合| 国产黄色片在线免费观看| 亚洲视频在线免费观看| 成人中文字幕在线| 北条麻妃AV在线播放| 一级黄色录相片| 亚洲大片| 精品国产午夜福利在线观看 | 免费看的黄色视频| 香蕉视频久久| 国产高清无码免费视频| 成人无码区免费AV毛片| 日韩无码性爱视频| 欧美日韩a片| 亚洲精品欧美久久婷婷| 午夜福利亚洲| 41ts午夜福利| 久久久久亚洲AV无码成人片| 婷婷五月天激情俺来也| 日韩免费一级| 亚洲无码精品专区| 欧美色图亚洲另类| 欧美日韩一区二区三区| 干干日日| 亚洲视频,中文字幕| 国产免费性爱视频| 久久v| 亚洲va国产天堂va久久en| 精品无码人妻一区二区三区| 欧美一区二区精品| 欧美性生活| 国产日皮视频| 国产一区二区三区四区五区在线| 亚洲色香蕉| 亚洲一区二区黄色电影视频网站| 999久久久| 上海熟妇搡BBBB搡BBBB| 午夜成人无码视频| 最美孕交vivoestv另类| 今天成全在线观看高清| 自拍成人视频| 色欲成人网| 日本在线www| 爱爱打炮影院| 欧美性爱一区二区三区| 久久久久久久久久久国产| 久久精品无码一区二区无码性色 | 久草手机视频在线观看| 亚洲成人精品AV| 国产精品欧美综合亚洲| 影音先锋麻豆| 天天干天天日天天色| 可以看的毛片| 日本操屄视频| 国产欧美综合视频一区二区在线 | 久草加勒比| 日韩免费视频观看| 久9精品| 一级黄色影院| 韩日无码| 人人爽人人干| 日本视频一区二区三区| 青青草成人在线观看| 中文字幕丰满的翔田千里| 久久精品视频久久| 国产AV激情| 久操视频在线播放| 国产在线精品观看| 五月天一区二区三区| 天天操天天操天天操天天| 亲子乱婬一级A片| 岛国av免费| 罗莉AV| 97超碰资源总站| 成人18视频| 欧美在线观看一区二区| 成人做爰100片免费看| 国产激情网站| 一级特黄大片色| 免费观看AV| 国产一区二区三区四区在线观看| 婷婷五月天激情丁香| av无码在线观看| 亚洲一区在线播放| 午夜久久久久久久久久久久91| 亚洲精品观看| 91AV一区二区三区| 一本久久A精品一合区久久久| 国产乱婬AAAA片视频| 色午夜| 亚洲欧洲av| ChineSe露脸老女人| 午夜成人无码视频| 无码精品一区二区三区在线观看| 无码一区二区三| 亚洲av资源| 97人妻在线视频| 久久草在线播放| 日韩欧美一级二级| 五月天婷婷小说| 日韩精品一区二区三免费视频| 久久久999| 欧美一级婬片A片免费软件| 青春草在线观看国产| 99福利| 天堂在线9| 日本久久久久| 丰满的人妻一区二区10| 国产色婷婷一区二区| 国产高清自拍| 亚洲中文无码视频| 中文字幕第98页| 久久AV影院| 色天使av| 青青操久久| 一区二区A片| 国产操逼无码| 亲子乱婬-一级A片| 国产免费激情视频| 男人午夜AV| 欧美一级A片高清免费播放| 西西888WWW大胆无码| 亚洲综合天堂| 国产精品久久久精品cos| 麻豆视频一区二区三区| 久久五月亭亭| 18禁网站在线播放| 人人看人人摸人人插| 在线观看高清无码中文字幕| 国产一级黄片| 蜜桃视频一区二区三区四区av| BBW老熟女BBw| a视频免费在线观看| 亚洲AV无码乱码国产精品蜜芽| 天天干天天干天| 日韩四区| 一级a片免费| 热九九精品| 亚洲熟妇在线观看| 动漫操逼视频| 西西午夜视频| 国产精品视频你懂的| 日产精品久久| 中文字幕高清无码免费视频| 一级无码专区| 日日夜夜精品| 国产精品96久久久久久| 高潮视频在线观看| 国产免费成人视频| 狠狠干影院| 天天射天天爽| 性无码一区二区三区无码免费| 国产一级A| 人人草在线观看| h片网站在线观看| 操逼激情网| 亚洲码成人| 久热免费视频在线观看| 黑人大肉棒| 黄色免费av| 美女特黄视频| 免费黄网站在线观看| 色综合色综合色综合| 嘿嘿午夜影院| 色婷婷AV在线| 国产女人水真多18毛片18精品 | 波多野结衣成人网站| 亚洲操逼无码| 91丨九色丨蝌蚪丨肥女| 婷婷色色五月天图片| 蜜桃在线视频| 亚洲欧美综合| 奇米影视亚洲春色| 黄色片免费观看| 中文字幕欧美日韩| AV无码在线观看| 天天色播| 无码视频播放| 中文字幕91| 午夜免费福利| 69精品| 国产一级婬女AAAA片季秀英| 亚洲视频免费在线观看| 欧美日韩国产尤物主播精品| 精品人妻一二三区| 无码迷穴| 午夜国产精品AV| 北条麻妃在线播放一区| 日韩无码18| 99亚洲无码| 人妻无码在线观看| 成人性生交片无码免费看人| 五月天狠狠| 五月天激情av| 亚洲三级在线免费观看| 丁香婷婷综合网| 国产白丝精品91爽爽久久| 少妇高潮日韩| 日韩视频91| 99re66| 不卡视频一区二区三区| 亚洲欧美成人在线视频| anwuye官方网站| 天堂资源中文在线| 日韩啪啪网站| 亚洲视频中文字幕在线观看| 国产精品无码白浆高潮| 日皮视频免费| 日韩欧美在线视频观看| 亚洲AV无码成人精品| 黄色片网站在线观看| 四川w搡BBB搡wBBB搡| 精品操逼| 日韩精品在线免费观看| 色呦呦一欧美| 好吊一区二区| 欧美精品欧美精品系列| 中文字幕免费中文| 精品国产一二三区| 免费观看在线黄片| 午夜8050| 神马午夜视频| 在线看91| 高清无码在线不卡| 亚洲视频免费完整版在线播放| 一级黄色免费电影| 亚州毛片| 久久婷婷秘精品国产538| 最新中文字幕在线观看| 欧美视频免费操逼图。| 欧美作爱| 国产SUV精品一区二区| 加勒比国产在线| 色噜噜人妻av中文字幕| 亚洲欧美影院| 超碰久操| 另类老妇videos另类| 图片区视频区小说区| 日日撸| 色婷婷天天操天天干| 人人操人人摸人人射| 日韩色图在线观看| 伊人成人片| 韩国三级HD中文字幕的背景音乐 | 西西4444www大胆无| 日本不卡一区二区三区| 蜜桃视频一区二区三区四区av| 日韩欧美在线观看视频| 亚洲国产精品久久久久婷婷老年 | 麻豆国产精品一区| 日韩精品人妻中文字幕蜜乳| 无码人妻一区二区三区| 超碰在线| 亚洲国产成人在线| 国产suv精品一区二区6精华液| 蜜臀无码在线| 一区二区A片| 先锋资源在线视频| 熟练中出-波多野结衣| 国产精品你懂的| 欧美色图在线观看| 五月婷婷色欲| 国产福利在线导航| 欧美在线视频网| 午夜久久电影| 北京熟妇槡BBBB槡BBBB| 俺去也视频| 搡BBB搡BBBB搡BBBB| 日韩做爱| 亚洲天堂一| 加勒比综合网| 2018人人操| 欧美日韩中文字幕| 3D动漫精品啪啪一区二区免费| 日本免费A片| 日韩视频免费观看高清完整版在线观| 18成人毛片| 91逼| 豆花视频久久| 做爰视频毛片蜜桃| 蜜桃Av噜噜一区二区| 亚洲综合五月天婷婷丁香| 岛国A视频| 亚洲无吗视频| 天天精品视频| 人人干干| 97人妻人人澡人人爽人人精品 | 黄色亚洲| 国产精品三级| 中日韩中文字幕一区二区区别| www日韩欧美| 一级爱爱爱| 91精品国产麻豆国产自产在线 | 亚洲香蕉av| www.色中色| 亚洲色青| 97人妻在线视频| 丁香六月激情| 老司机精品在线观看| 先锋资源日韩| 亚洲精品秘一区二区三区在线观看| 粉嫩小泬BBBB免费看-百度| 日韩小视频在线观看| 天堂一区二区三区| 四虎影库男人天堂| 午夜丁香婷婷| 毛片黄色视频| 夜夜狠狠躁日日躁| 波多野结衣无码视频| 久久久一级| 超碰操一操| 伊人久久国产| 精品无码一区二区三| 女侠吕四娘第二部| 亚洲一区无码在线观看| 亚洲AV成人无码精品区| 久久综合五月天| 国产精品AV在线| 日本三级片在线动| 婷婷五月六月| 99久久夜色精品国产亚洲| 夜夜爽天天爽| 青青操在线视频| 日韩aaa视频| 激情色色| 日逼日逼日逼| AV在线免费播放| 欧美黑人操逼视频| 精品无码一区二区三区在线| 神马影院午夜福利| 九九国产视频| 99re6热在线精品视频功能| 亚洲国产免费视频| 欧美熟妇BBB搡BBB| 亚洲高清无码中文字幕| 国产精品96久久久久久| 国产a毛一级,a毛一级| 日日艹夜夜艹| 中文字幕第6页| 中文字幕在线免费观看| 婷婷丁香花| 日韩综合在线视频| 影音先锋天堂| 精品国产一区二区三区性色AV| 久久免费毛片| 超碰免费91| 无码人妻av黄色一区二区三区| 亚洲无码高清视频| 双腿张开被9个男人调教| 欧美日韩成人片| 潮喷在线| 久久人人做| 成人一区视频| 91欧美日韩综合| 日韩综合| 欧美AAAAAAAA| 久久超碰精品| 日韩人妻精品中文字幕| 欧美成人一级a片| 大香蕉伊人婷婷| 强辱丰满人妻HD中文字幕| 安徽妇搡BBBB搡BBBB小说| 嘿嘿av| aⅴ无码| 亚洲少妇视频| 亚洲无码午夜| 在线观看国产小视频| 精品国产乱码久久久久久郑州公司 | 国产区欧美去区在线| 国产粉嫩| 国产精品成人3p一区二区三区| 日韩高清无码观看| 国产综合久久777777麻豆| 特黄视频| 日韩激情一区二区| 天天添| 欧美一区二区在线观看| 国产成人A∨| 无码人妻丰满熟妇精品| 亚洲自拍偷拍视频| 五月伊人婷婷| 黄片高清无码在线观看| 成人免费视频国产免费麻豆,| 狼友视频在线| 午夜无码久久| 精品美女视频在线观看免费软件| 久草综合在线| 白峰美羽人妻AND-499| 久久久成人免费视频| 丁香五月中文字幕| 亚洲国产精品成人网站| 中文字幕亚洲第一| 最近中文字幕免费MV第一季歌词怀孕 | 中日韩精品A片中文字幕| 无码AV免费观看| 国产欧美熟妇另类久久久| 久久精品视频在线免费观看| 亚洲AV一二三区| 波多野结衣亚洲| 日本成人A| 中文字幕手机在线视频| 超碰久热| 亚洲无码十八禁| 五月天激情导航| 狠狠干综合| 北京熟妇搡BBBB搡BBBB电影 | 欧美成人在线免费视频| 日本一区二区在线| 日韩一区二区三区在线视频| 日本中文字幕不卡| a在线| 国产精品在线看| 日韩无码免费播放| 蜜桃影视| 无码AV网| 欧美日本亚洲| 伊人啪啪| 91黄色在线观看| 无码免费视频| 久久视频免费在线观看| 99精品久久久久久无码| 青草大香蕉| 国产不卡在线视频| 人人妻人人澡人人爽人人| 色五月婷婷五月天激情| www.日韩无码| av资源在线|