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

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

MVC實戰起步(一):一個簡易框架的搭建

2019-11-14 13:47:33
字體:
來源:轉載
供稿:網友

一:引言

這僅僅是一個新手寫給新手共同入門的博文!這是一個使用MVC,和一些主流框架(Autofac,Log4Net等)來完成的一個簡單的項目。和各位學習MVC的朋友們一起學習。

二:項目分層

image

如左圖所示,先建好文件夾,然后再來填充內容。

一:Zero,MVC4.0項目

二:Domain: Abstract倉儲類接口,Concrete倉儲類實現,Entities實體模型

三:Infrastructure:基礎設施

四:IOC:主要用于解耦倉儲類接口

 

 

 

 

三:Infrastructure層建設

首先,從最底層寫起:

第一步,寫一個操作數據庫的類

我這邊采用的是底層使用ADO.NET,通過泛型約束和反射來實現一個簡單的ORM

1:先在Conntion里面放一個SQLHelper類(找個自己熟悉的),這里就不做工廠了。怎么簡單怎么來,先讓東西跑起來

2:寫個屬于自己的ORM類:我們先來想想,如果不考慮存儲過程(返回集合,直接LINQ處理數據),我們需要什么東西來拼接SQL語句,首先,要有表名,然后主鍵,然后各個字段名稱,其他的先不考慮,現在寫一個IDateBase抽象類來約束實體類,往Infrastructure層的IBase文件夾里新建一個IDateBase抽象類,代碼如下:

namespace Zero.Infrastructure.IBase{    public abstract class IDataBase    {        public virtual string TableName { get; set; }        public virtual int ID { get; set; }    }}
abstract class IDataBase

這樣就解決了表名和主鍵名稱在用泛型的時候,取不到的問題了,但是字段名稱不行啊,每個表的字段都不一樣,所以最后還是要用到反射,寫一個特性來反射,在Infrastructure層的Attributes文件夾下面建立一個類DataFieldAttribute

代碼如下:

namespace Zero.Infrastructure.Attributes{    public class DataFieldAttribute : Attribute    {        PRivate string _FieldName;        public DataFieldAttribute(string fieldname)        {            this._FieldName = fieldname;        }        public string FieldName        {            get { return this._FieldName; }            set { this._FieldName = value; }        }    }}

 

完事具備,我們先寫一個實體類,然后開始寫ORM

實體里建立在Domain的Entities文件夾下面,記得Domain層要引用Infrastructure層

using System;using System.Collections.Generic;using System.Linq;using System.Text;using Zero.Infrastructure.Attributes;using Zero.Infrastructure.IBase;namespace Zero.Domain.Entities{    public class User: IDataBase    {        public User()        {            TableName = "User";        }        private string _TableName;        public override string TableName        {            get            {                if (_TableName == null)                { return "User"; }                else { return _TableName; }            }            set { _TableName = value; }        }        public override int ID { get; set; }        [DataFieldAttribute("UserName")]        public string UserName { get; set; }    }}
View Code

 

代碼如上

現在開始寫自己的ORM類

在Infrastructure層的Conntion文件夾下面建立一個ZeroORM類,ORM需要實現的功能有:查詢,添加,更改,刪除,4個基本功能

public class ZeroORMwhere<T> where T : IBase.IDataBase{    public string SqlConnctionString { get; set; }    public SqlConnection conn { get; set; }    public SqlTransaction tran { get; set; }}

 

然后增加查詢方法:

/// <summary>    /// 獲得實體T所有數據    /// </summary>    /// <returns></returns>    public List<T> Select(T t)    {        List<T> list = new List<T>();        string sql = "select * from " + t.TableName + " WITH (NOLOCK) order by id desc";        DataSet ds = SqlHelper.ExecuteDataset(SqlConnctionString, CommandType.Text, sql);        for (int i = 0; i < ds.Tables[0].Rows.Count; i++)        {            list.Add(DataSetToEntity.DsToEntity<T>(ds, i));        }        return list;    }

 

DataSetToEntity這個類就是網上找的Dataset轉實體的方法,大家可以網上找下,最后返回一個List集合

然后是添加方法

/// <summary>       /// 插入新數據       /// </summary>       /// <param name="t">實體類</param>       /// <returns></returns>       public int Insert(T t)       {           try           {               Type mytype = t.GetType();               // 獲取類的所有公共屬性               System.Reflection.PropertyInfo[] pInfo = mytype.GetProperties();               string FieldName = "";//字段名稱               string Values = "";//               StringBuilder sql = new StringBuilder();               List<SqlParameter> paras = new List<SqlParameter>();//不定參集合,防注入               sql.Append("Insert into ");               sql.Append(mytype.Name);//數據庫表名,可以放t.TableName               sql.Append("(");               object[] objDataFieldAttribute = null;               foreach (System.Reflection.PropertyInfo pio in pInfo)               {                   objDataFieldAttribute = pio.GetCustomAttributes(typeof(DataFieldAttribute), false);                   if (objDataFieldAttribute != null && objDataFieldAttribute.Length > 0)                   {                       FieldName += ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + ",";//給字段賦值                       Values += "@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + ",";//給對應字段的值賦值                       paras.Add(new SqlParameter("@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName, pio.GetValue(t, null)));//添加不定參                   }               }               FieldName = FieldName.TrimEnd(',');               Values = Values.TrimEnd(',');               sql.Append(FieldName);               sql.Append(") VAlUES (");               sql.Append(Values);               sql.Append(")");               int i = SqlHelper.ExecuteNonQuery(SqlConnctionString, CommandType.Text, sql.ToString(), paras.ToArray());               return i;           }           catch (Exception)           {               return -1;               throw;           }       }
View Code

 

還有修改和刪除方法,以及帶事務的方法,一起貼出來。

using System;using System.Collections.Generic;using System.Data;using System.Data.SqlClient;using System.Linq;using System.Reflection;using System.Text;using Zero.Infrastructure.Attributes;using Zero.Infrastructure.Utilities;namespace Zero.Infrastructure.Conntion{    public class ZeroORM<T> where T : IBase.IDataBase    {        public string SqlConnctionString { get; set; }        public SqlConnection conn { get; set; }        public SqlTransaction tran { get; set; }        /// <summary>        /// 獲得實體T所有數據        /// </summary>        /// <returns></returns>        public List<T> Select(T t)        {            List<T> list = new List<T>();            string sql = "select * from [" + t.TableName + "] WITH (NOLOCK) order by id desc";  //出于性能考慮,不用反射來獲取表名            DataSet ds = SqlHelper.ExecuteDataset(SqlConnctionString, CommandType.Text, sql);            for (int i = 0; i < ds.Tables[0].Rows.Count; i++)            {                list.Add(DataSetToEntity.DsToEntity<T>(ds, i));            }            return list;        }        /// <summary>        /// 根據主鍵ID獲取數據(一條)        /// </summary>        /// <param name="id"></param>        /// <param name="TableName"></param>        /// <returns></returns>        public T SelectByID(int id, T t)        {            string sql = "select * from [" + t.TableName + "] WITH (NOLOCK) where ID=@ID"; //出于性能考慮,不用反射來獲取表名            DataSet ds = SqlHelper.ExecuteDataset(SqlConnctionString, CommandType.Text, sql, new SqlParameter("@ID", id));            t = DataSetToEntity.DsToEntity<T>(ds, 0);            PropertyInfo[] prop = t.GetType().GetProperties();            return t;        }         /// <summary>        /// 插入新數據        /// </summary>        /// <param name="t">實體類</param>        /// <returns></returns>        public int Insert(T t)        {            try            {                Type mytype = t.GetType();                // 獲取類的所有公共屬性                System.Reflection.PropertyInfo[] pInfo = mytype.GetProperties();                string FieldName = "";//字段名稱                string Values = "";//                StringBuilder sql = new StringBuilder();                List<SqlParameter> paras = new List<SqlParameter>();                sql.Append("Insert into [");                sql.Append(mytype.Name);//數據庫表名                sql.Append("](");                object[] objDataFieldAttribute = null;                foreach (System.Reflection.PropertyInfo pio in pInfo)                {                    objDataFieldAttribute = pio.GetCustomAttributes(typeof(DataFieldAttribute), false);                    if (objDataFieldAttribute != null && objDataFieldAttribute.Length > 0)                    {                        FieldName += ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + ",";                        Values += "@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + ",";                        paras.Add(new SqlParameter("@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName, pio.GetValue(t, null)));                    }                }                FieldName = FieldName.TrimEnd(',');                Values = Values.TrimEnd(',');                sql.Append(FieldName);                sql.Append(") VAlUES (");                sql.Append(Values);                sql.Append(")");                int i = SqlHelper.ExecuteNonQuery(SqlConnctionString, CommandType.Text, sql.ToString(), paras.ToArray());                return i;            }            catch (Exception)            {                return -1;                throw;            }        }        /// <summary>        /// 更新數據        /// </summary>        /// <param name="t">需更新的實體類</param>        /// <returns></returns>        public int Update(T t)        {            try            {                int i = 0;                int primarykey = t.ID;                T oldT = t;                Type mytype = t.GetType();                System.Reflection.PropertyInfo[] pInfo = mytype.GetProperties();                oldT = SelectByID(primarykey, oldT);//獲得原始值,為日志做準備                if (t != oldT)                {                    string SetValue = "";//字段名稱                    string Where = " where ID=@ID";//                    StringBuilder sql = new StringBuilder();                    List<SqlParameter> paras = new List<SqlParameter>();                    sql.Append("Update [");                    sql.Append(mytype.Name);                    sql.Append("] Set ");                    object[] objDataFieldAttribute = null;                    foreach (System.Reflection.PropertyInfo pio in pInfo)                    {                        objDataFieldAttribute = pio.GetCustomAttributes(typeof(DataFieldAttribute), false);                        if (objDataFieldAttribute != null && objDataFieldAttribute.Length > 0 && pio.GetValue(t, null).ToString() != pio.GetValue(oldT, null).ToString())                        {                            SetValue += ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + "=" + "@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + ",";                            paras.Add(new SqlParameter("@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName, pio.GetValue(t, null)));                        }                    }                    SetValue = SetValue.TrimEnd(',');                    sql.Append(SetValue);                    sql.Append(Where);                    paras.Add(new SqlParameter("@ID", primarykey));                    i = SqlHelper.ExecuteNonQuery(SqlConnctionString, CommandType.Text, sql.ToString(), paras.ToArray());                    return i;                }                else                {                    return -2;                }            }            catch (Exception)            {                return -1;                throw;            }        }        /// <summary>        /// 刪除數據        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public int Delete(T t)        {            int i = 0;            int primarykey = t.ID;            Type mytype = t.GetType();            string TableName = mytype.Name;            string Where = " where ID =@ID";            string sql = "DELETE FROM " + TableName + Where;            try            {                i = SqlHelper.ExecuteNonQuery(SqlConnctionString, CommandType.Text, sql, new SqlParameter("@ID", primarykey));                return i;            }            catch (Exception)            {                return -1;                throw;            }        }        /// <summary>        /// 開始事務        /// </summary>        /// <returns></returns>        public void BeginTran()        {            try            {                conn = new SqlConnection(SqlConnctionString);                conn.Open();                tran = conn.BeginTransaction();            }            catch (Exception)            {                tran.Rollback();                conn.Close();                throw;            }        }        /// <summary>        /// 帶事務的插入方法        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public int InsertByTran(T t)        {            try            {                Type mytype = t.GetType();                // 獲取類的所有公共屬性                System.Reflection.PropertyInfo[] pInfo = mytype.GetProperties();                string FieldName = "";//字段名稱                string Values = "";//                StringBuilder sql = new StringBuilder();                List<SqlParameter> paras = new List<SqlParameter>();                sql.Append("Insert into [");                sql.Append(mytype.Name);//數據庫表名                sql.Append("](");                object[] objDataFieldAttribute = null;                foreach (System.Reflection.PropertyInfo pio in pInfo)                {                    objDataFieldAttribute = pio.GetCustomAttributes(typeof(DataFieldAttribute), false);                    if (objDataFieldAttribute != null && objDataFieldAttribute.Length > 0)                    {                        FieldName += ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + ",";                        Values += "@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + ",";                        paras.Add(new SqlParameter("@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName, pio.GetValue(t, null)));                    }                }                FieldName = FieldName.TrimEnd(',');                Values = Values.TrimEnd(',');                sql.Append(FieldName);                sql.Append(") VAlUES (");                sql.Append(Values);                sql.Append(")");                int i = SqlHelper.ExecuteNonQuery(tran, CommandType.Text, sql.ToString(), paras.ToArray());                return i;            }            catch (Exception)            {                tran.Rollback();                return -1;                throw;            }        }        /// <summary>        /// 帶事務的更新方法        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public int UpdateByTran(T t)        {            try            {                int i = 0;                int primarykey = t.ID;                T oldT = t;                Type mytype = t.GetType();                System.Reflection.PropertyInfo[] pInfo = mytype.GetProperties();                oldT = SelectByID(primarykey, oldT);//獲得原始值,為日志做準備                if (t != oldT)                {                    string SetValue = "";//字段名稱                    string Where = " where ID=@ID";//                    StringBuilder sql = new StringBuilder();                    List<SqlParameter> paras = new List<SqlParameter>();                    sql.Append("Update [");                    sql.Append(mytype.Name);                    sql.Append("] Set ");                    object[] objDataFieldAttribute = null;                    foreach (System.Reflection.PropertyInfo pio in pInfo)                    {                        objDataFieldAttribute = pio.GetCustomAttributes(typeof(DataFieldAttribute), false);                        if (objDataFieldAttribute != null && objDataFieldAttribute.Length > 0 && pio.GetValue(t, null).ToString() != pio.GetValue(oldT, null).ToString())                        {                            SetValue += ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + "=" + "@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName + ",";                            paras.Add(new SqlParameter("@" + ((DataFieldAttribute)objDataFieldAttribute[0]).FieldName, pio.GetValue(t, null)));                        }                    }                    SetValue = SetValue.TrimEnd(',');                    sql.Append(SetValue);                    sql.Append(Where);                    paras.Add(new SqlParameter("@ID", primarykey));                    i = SqlHelper.ExecuteNonQuery(tran, CommandType.Text, sql.ToString(), paras.ToArray());                    return i;                }                else                {                    tran.Rollback();                    return -2;                }            }            catch (Exception)            {                tran.Rollback();                return -1;                throw;            }        }        /// <summary>        /// 帶事務的刪除方法        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public int DeleteByTran(T t)        {            int i = 0;            int primarykey = t.ID;            Type mytype = t.GetType();            string TableName = mytype.Name;            string Where = "] where ID =@ID";            string sql = "DELETE FROM [" + TableName + Where;            try            {                i = SqlHelper.ExecuteNonQuery(tran, CommandType.Text, sql, new SqlParameter("@ID", primarykey));                return i;            }            catch (Exception)            {                tran.Rollback();                return -1;                throw;            }        }        /// <summary>        /// 帶事務和條件的刪除方法        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public int DeleteByTran(T t, string where)        {            if (where.IndexOf("1=1") > 0)            {                return -1;            }            int i = 0;            string Where = "] where " + where;            string sql = "DELETE FROM [" + t.TableName + Where;            try            {                i = SqlHelper.ExecuteNonQuery(tran, CommandType.Text, sql, null);                return i;            }            catch (Exception)            {                tran.Rollback();                return -1;                throw;            }        }        /// <summary>        /// 提交事務        /// </summary>        /// <returns></returns>        public void CommitTran()        {            try            {                tran.Commit();                conn.Close();            }            catch (Exception)            {                tran.Rollback();                conn.Close();                throw;            }            finally            {                tran.Dispose();                conn.Dispose();            }        }        /// <summary>        /// 回滾事務        /// </summary>        public void RollBackTran()        {            try            {                tran.Rollback();            }            catch (Exception)            {                throw;            }        }    }}
View Code

 

好了,整個ORM就寫完了,這樣我們數據處理的類就寫完了!

三:Domain層

ORM寫完后,因為不同的表可能在不同的庫中,所以ZeroORM還不能直接拿來用,需要在上面隔離一層,我們這里選擇最簡單的方式,大牛勿噴。

首先寫一個Repository基類(這里就不抽象類了),代碼如下

using System;using System.Collections.Generic;using System.Linq;using System.Text;using Zero.Domain.Abstract;using Zero.Infrastructure.IBase;namespace Zero.Domain.Concrete{    public class ConcreteBase<T> where T : IDataBase    {        public Zero.Infrastructure.Conntion.ZeroORM<T> DbHelper;        public ConcreteBase()        {            DbHelper = new Infrastructure.Conntion.ZeroORM<T>();        }        public string SqlConnctionString { get { return DbHelper.SqlConnctionString; } set { DbHelper.SqlConnctionString = value; } }        public List<T> GetAllList(T t)        {            List<T> ubiList = new List<T>();            ubiList = DbHelper.Select(t);            return ubiList;        }        public bool Insert(T t)        {            int i = 0;            i = DbHelper.Insert(t);            return i > 0;        }        public bool Update(T t)        {            int i = 0;            i = DbHelper.Update(t);            return i > 0;        }        public bool Delete(T t)        {            int i = 0;            i = DbHelper.Delete(t);            return i > 0;        }        /// <summary>        /// 帶事務的插入方法        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public bool InsertByTran(T t)        {            if (DbHelper.tran == null)            {                DbHelper.BeginTran();            }            int i = DbHelper.InsertByTran(t);            return i > 0;        }        /// <summary>        /// 帶事務的更新方法        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public bool UpdateByTran(T t)        {            if (DbHelper.tran == null)            {                DbHelper.BeginTran();            }            int i = DbHelper.UpdateByTran(t);            return i > 0;        }        /// <summary>        /// 帶事務的刪除方法        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public bool DeleteByTran(T t)        {            if (DbHelper.tran == null)            {                DbHelper.BeginTran();            }            int i = DbHelper.DeleteByTran(t);            return i > 0;        }        /// <summary>        /// 帶事務和條件的刪除方法        /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public bool DeleteByTran(T t, string where)        {            if (DbHelper.tran == null)            {                DbHelper.BeginTran();            }            int i = DbHelper.DeleteByTran(t, where);            return i > 0;        }         /// <summary>        ///         /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public void RollBackTran()        {            DbHelper.RollBackTran();        }        /// <summary>        ///         /// </summary>        /// <param name="t"></param>        /// <returns></returns>        public void BeginTran()        {            DbHelper.BeginTran();        }        /// <summary>        /// 提交事務 提交成功返回"";失敗返回錯誤信息        /// </summary>        /// <returns>提交成功返回"";失敗返回錯誤信息</returns>        public string CommitTran()        {            if (DbHelper.tran != null)            {                try                {                    DbHelper.CommitTran();                    return "";                }                catch (Exception e)                {                    return e.ToString();                    throw;                }            }            else            {                return "不存在可提交的事務";            }        }        /// <summary>        /// 根據主鍵ID查詢結果,返回T        /// </summary>        /// <param name="id"></param>        /// <returns></returns>        public T SelectByID(string id, T t)        {            if (id != "")            {                return DbHelper.SelectByID(int.Parse(id), t);            }            else            {                return null;            }        }    }}
View Code

 

然后去寫Repository類和IRepository接口

using System;using System.Collections.Generic;using System.Linq;using System.Text;using Zero.Domain.Entities;namespace Zero.Domain.Abstract{    public interface IUserRepository    {        User GetEntity();        IQueryable<User> Users { get; }    }}

 

實現類:

using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using System.Text;using Zero.Domain.Abstract;using Zero.Domain.Entities;namespace Zero.Domain.Concrete{    public class UserRepository : ConcreteBase<User>, IUserRepository    {        public User GetEntity()        {            return new User();        }        public IQueryable<User> BaseTitleTypes        {            get { return GetAllList(GetEntity()).AsQueryable(); }        }        public UserRepository()            : base()        {            SqlConnctionString = ConfigurationManager.ConnectionStrings["ZeroTest"].ConnectionString;//獲取連接字符串        }    }}

 

然后去數據庫建表

image
鏈接字符串的位置寫的有點蠢,不過先這樣做吧,一切已快速為目的

現在,所有的準備工作都做完了,開始測試一下數據交互是否有問題!

在Zero項目中建一個Index控制器

image

image

然后右鍵Index添加視圖。先不做IOC解耦,引用Domain層和基礎設施層。

添加如下代碼

//  // GET: /Index/  public ActionResult Index()  {      UserRepository us = new UserRepository();      bool b =us.Insert(new Domain.Entities.User { UserName = "Ambre" });      if (b)      {          var ListEntity = from o in us.Users                           select o;          return Json(ListEntity, JsonRequestBehavior.AllowGet);      }      else      {          return Content(b.ToString());      }  }

 

然后去改下路由設置

image

啟動項目

image

好了,完成!下篇文章將寫如何快速的將IOC應用到項目中,然后前端類似于EasyUi的grid控件如何編寫。

謝謝大家,喜歡的話,點個贊,這可是我的處女文呢!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久中文字幕| 国产精品扒开腿爽爽爽视频| 亚洲大胆人体在线| 国产精品久久久久久久久久小说| 国产精品一久久香蕉国产线看观看| 中文字幕精品www乱入免费视频| 98精品在线视频| 性色av一区二区三区免费| 欧美亚洲第一页| 538国产精品视频一区二区| 久久韩国免费视频| 日韩免费观看视频| 日韩亚洲欧美中文高清在线| 欧美刺激性大交免费视频| 日韩精品在线免费观看视频| 日韩乱码在线视频| 一区二区三区精品99久久| 欧美日韩中国免费专区在线看| 欧美日韩精品在线观看| 国产精品久久国产精品99gif| 久久精品99久久香蕉国产色戒| 日本欧美精品在线| 97在线免费观看| 日韩电影中文字幕av| 日韩高清电影好看的电视剧电影| 欧美精品久久久久久久免费观看| 精品久久香蕉国产线看观看gif| 亚洲国产精品专区久久| 一区二区成人精品| 日韩av第一页| 日韩av在线一区| 国产精品第8页| 国产精品视频公开费视频| 伊人久久久久久久久久久久久| 日韩欧美在线一区| 欧美贵妇videos办公室| 国产色婷婷国产综合在线理论片a| 91日本在线视频| 欧美床上激情在线观看| 欧美激情伊人电影| 国产精品99久久99久久久二8| 国产精品视频xxx| 久久久久亚洲精品国产| 国产在线观看精品| 欧美美女18p| 92国产精品久久久久首页| 91亚洲精华国产精华| 亚洲午夜性刺激影院| 国外成人免费在线播放| 亚洲精品自在久久| 色婷婷综合久久久久中文字幕1| 欧美电影在线观看完整版| 91美女片黄在线观| 久久久久久久一| 国产97免费视| 欧美在线视频一二三| 日韩在线免费视频| 欧美高清视频在线| 日韩欧美视频一区二区三区| 精品久久久久久久久久久久| www.亚洲男人天堂| 日韩美女免费观看| 国模私拍视频一区| 欧美日韩国产二区| 亚洲第一天堂无码专区| 日本成熟性欧美| 亚洲91精品在线观看| 欧美高清视频在线观看| 亚洲精品成人久久电影| 亚洲成人激情视频| 欧美精品久久久久久久| 日韩最新在线视频| 日韩成人在线网站| 57pao国产精品一区| 日韩成人av在线播放| 97国产真实伦对白精彩视频8| 日韩h在线观看| 国产精品美女在线观看| 尤物yw午夜国产精品视频明星| 欧美日韩国产va另类| 97视频在线观看免费高清完整版在线观看| 国产精品久久久久久久久男| 欧美一级黄色网| 亚洲v日韩v综合v精品v| 亚洲国模精品一区| 91理论片午午论夜理片久久| 欧美激情乱人伦| 欧美激情性做爰免费视频| 成人免费网站在线观看| 插插插亚洲综合网| 久久精品国产一区二区电影| 亚洲精品欧美日韩专区| 亚洲久久久久久久久久| 精品国产乱码久久久久酒店| 亚洲热线99精品视频| 1769国内精品视频在线播放| 亚洲第一在线视频| 色综合久久久久久中文网| 久久五月天色综合| 色午夜这里只有精品| 亚洲欧美日韩精品| 久久夜色精品亚洲噜噜国产mv| 国产精品人人做人人爽| 亚洲新中文字幕| 51色欧美片视频在线观看| 97香蕉超级碰碰久久免费软件| 国产a∨精品一区二区三区不卡| 亚洲成人久久电影| 色婷婷久久av| 欧美夜福利tv在线| 亚洲www在线观看| 国产精品美女www爽爽爽视频| 欧美裸体男粗大视频在线观看| 国产精品免费久久久久久| 91视频九色网站| 97国产精品视频人人做人人爱| 7777kkkk成人观看| 久久亚洲精品中文字幕冲田杏梨| 成人a在线视频| 亚洲男人第一网站| 亚洲天堂2020| 中文字幕亚洲一区二区三区五十路| 色综合伊人色综合网| 久久久午夜视频| 麻豆国产精品va在线观看不卡| 久久久精品国产网站| 伊人久久男人天堂| 久久精品亚洲国产| 91久久久久久国产精品| 亚洲欧洲日产国码av系列天堂| 精品免费在线观看| 91av在线网站| 在线观看国产精品淫| 欧美国产乱视频| 在线亚洲欧美视频| 国产亚洲精品久久久久动| 久久伊人精品一区二区三区| www日韩欧美| 欧美日韩免费一区| 久久久久久久激情视频| 国产91精品高潮白浆喷水| 国产精品久久久久久久久久ktv| 欧美色另类天堂2015| 美日韩丰满少妇在线观看| 成人激情在线观看| 国模吧一区二区三区| 久久99久国产精品黄毛片入口| 国外色69视频在线观看| 亚洲欧美中文字幕在线一区| 国产精品一区久久久| 欧美在线中文字幕| 深夜成人在线观看| 福利视频导航一区| 欧美精品免费播放| 亚洲色图综合久久| 91久久嫩草影院一区二区| 国产精品中文在线| 国产精品欧美激情| 国产日韩欧美中文| 97在线视频一区| 久久国产精品久久久久久| 日本欧美黄网站| 国产精品吴梦梦| 国产在线视频91|