1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        無(wú)需編程,基于甲骨文oracle數(shù)據(jù)庫(kù)零代碼生成CRUD增刪改查RESTful API接口

        共 13760字,需瀏覽 28分鐘

         ·

        2022-07-30 21:24

        甲骨文oracle數(shù)據(jù)庫(kù)


        回顧


        通過(guò)之前一篇文章?多數(shù)據(jù)庫(kù)支持?的介紹,采用抽象工廠設(shè)計(jì)模式,已經(jīng)支持了大象數(shù)據(jù)庫(kù)PostgreSQL。之前通過(guò)字符串拼接生成DDL SQL語(yǔ)句,比較繁瑣。本文開(kāi)始,引入了FreeMarker模版引擎,通過(guò)配置模版實(shí)現(xiàn)創(chuàng)建和修改物理表結(jié)構(gòu)SQL語(yǔ)句,簡(jiǎn)化了大量代碼,提高了效率,并且通過(guò)配置oracle數(shù)據(jù)庫(kù)SQL模版,基于oracle數(shù)據(jù)庫(kù),零代碼實(shí)現(xiàn)crud增刪改查。


        FreeMarker簡(jiǎn)介


        FreeMarker是一款模板引擎: 即一種基于模板和要改變的數(shù)據(jù),并用來(lái)生成輸出文本(HTML網(wǎng)頁(yè),電子郵件,配置文件,源代碼等)的通用工具。 它不是面向最終用戶的,而是一個(gè)Java類庫(kù),是一款程序員可以嵌入他們所開(kāi)發(fā)產(chǎn)品的組件。模板編寫(xiě)為FreeMarker Template Language (FTL)。它是簡(jiǎn)單的,專用的語(yǔ)言, 不是像PHP那樣成熟的編程語(yǔ)言。 那就意味著要準(zhǔn)備數(shù)據(jù)在真實(shí)編程語(yǔ)言中來(lái)顯示,比如數(shù)據(jù)庫(kù)查詢和業(yè)務(wù)運(yùn)算,之后模板顯示已經(jīng)準(zhǔn)備好的數(shù)據(jù)。在模板中,你可以專注于如何展現(xiàn)數(shù)據(jù),而在模板之外可以專注于要展示什么數(shù)據(jù)。


        UI界面


        通過(guò)產(chǎn)品對(duì)象為例,無(wú)需編程,基于Oracle數(shù)據(jù)庫(kù),通過(guò)配置零代碼實(shí)現(xiàn)CRUD增刪改查RESTful API接口和管理UI。

        productMeta?創(chuàng)建產(chǎn)品

        table?編輯產(chǎn)品數(shù)據(jù)

        productList?產(chǎn)品數(shù)據(jù)列表

        Oracle SQL Developer?通過(guò)Oracle SQL Developer查詢Oracle數(shù)據(jù)


        定義元數(shù)據(jù)對(duì)象模型


        元數(shù)據(jù)表ca_meta_table


        ca_meta_table?元數(shù)據(jù)表ca_meta_table,用于記錄表的基本信息。

        #

        TableEntity對(duì)象


        TableEntity為“元數(shù)據(jù)表”對(duì)象,和ca_meta_table字段對(duì)應(yīng)


        public class TableEntity {
            private Long id;
        
            private String name;
        
            private String caption;
        
            private String description;
        
            private Timestamp createdDate;
        
            private Timestamp lastModifiedDate;
        
            private String pluralName;
        
            private String tableName;
        
            private EngineEnum engine;
        
            private Boolean createPhysicalTable;
        
            private Boolean reverse;
        
            private Boolean systemable;
        
            private Boolean readOnly;
        
            private List<ColumnEntity> columnEntityList;
        
            private List<IndexEntity> indexEntityList;
        }
        

        #

        元數(shù)據(jù)列ca_meta_column


        ca_meta_column?元數(shù)據(jù)列ca_meta_column,用于記錄表字段信息,比如類型,長(zhǎng)度,默認(rèn)值等。

        #

        ColumnEntity對(duì)象


        ColumnEntity為“元數(shù)據(jù)列”對(duì)象,和ca_meta_column字段對(duì)應(yīng)


        public class ColumnEntity {
          private Long id;
        
          private String name;
        
          private String caption;
        
          private String description;
        
          private Timestamp createdDate;
        
          private Timestamp lastModifiedDate;
        
          private Integer displayOrder;
        
          private DataTypeEnum dataType;
        
          private IndexTypeEnum indexType;
        
          private IndexStorageEnum indexStorage;
        
          private String indexName;
        
          private Integer length;
        
          private Integer precision;
        
          private Integer scale;
        
          private String defaultValue;
        
          private Long seqId;
        
          private Boolean unsigned;
        
          private Boolean autoIncrement;
        
          private Boolean nullable;
        
          private Boolean insertable;
        
          private Boolean updatable;
        
          private Boolean queryable;
        
          private Boolean displayable;
        
          private Boolean systemable;
        
          private Long tableId;
        }
        

        #

        元數(shù)據(jù)索引ca_meta_index


        ca_meta_index?元數(shù)據(jù)索引ca_meta_index,用于記錄表聯(lián)合索引信息,比如索引類型,名稱等。


        IndexEntity對(duì)象


        IndexEntity為“元數(shù)據(jù)索引”對(duì)象,和ca_meta_index字段對(duì)應(yīng)


        public class IndexEntity {
          private Long id;
        
          private String name;
        
          private String caption;
        
          private String description;
        
          private Timestamp createdDate;
        
          private Timestamp lastModifiedDate;
        
          private IndexTypeEnum indexType;
        
          private IndexStorageEnum indexStorage;
        
          private Long tableId;
        
          private List<IndexLineEntity> indexLineEntityList;
        }
        


        元數(shù)據(jù)索引行ca_meta_index_line


        ca_meta_index_line?元數(shù)據(jù)索引行ca_meta_index_line,用于記錄表聯(lián)合索引行信息,一個(gè)聯(lián)合索引可以對(duì)應(yīng)多個(gè)聯(lián)合索引行,表示由多個(gè)字段組成。


        IndexLineEntity對(duì)象


        IndexLineEntity“元數(shù)據(jù)索行”對(duì)象,和ca_meta_index_line字段對(duì)應(yīng)


        public class IndexLineEntity {
          private Long id;
        
          private Long columnId;
        
          private ColumnEntity columnEntity;
        
          private Long indexId;
        }
        


        定義FreeMarker模版


        創(chuàng)建表create-table.sql.ftl


        CREATE TABLE "${tableName}" (
        <#list columnEntityList as columnEntity>
          <#if columnEntity.dataType == "BOOL">
            "${columnEntity.name}" NUMBER(1)<#if columnEntity.defaultValue??> DEFAULT <#if columnEntity.defaultValue == "true">1<#else>0</#if></#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "INT">
            "${columnEntity.name}" INT<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity.indexType?? && columnEntity.indexType == "PRIMARY"> PRIMARY KEY</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "BIGINT">
            "${columnEntity.name}" INT<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity.indexType?? && columnEntity.indexType == "PRIMARY"> PRIMARY KEY</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "FLOAT">
            "${columnEntity.name}" FLOAT<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "DOUBLE">
            "${columnEntity.name}" REAL<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "DECIMAL">
            "${columnEntity.name}" DECIMAL<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "DATE">
            "${columnEntity.name}" DATE<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "TIME">
            "${columnEntity.name}" CHAR(8)<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "DATETIME">
            "${columnEntity.name}" DATE<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "TIMESTAMP">
            "${columnEntity.name}" TIMESTAMP<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "CHAR">
            "${columnEntity.name}" CHAR(${columnEntity.length})<#if columnEntity.defaultValue??> DEFAULT '${columnEntity.defaultValue}'</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity.indexType?? && columnEntity.indexType == "PRIMARY"> PRIMARY KEY</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "VARCHAR">
            "${columnEntity.name}" VARCHAR(${columnEntity.length})<#if columnEntity.defaultValue??> DEFAULT '${columnEntity.defaultValue}'</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity.indexType?? && columnEntity.indexType == "PRIMARY"> PRIMARY KEY</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "PASSWORD">
            "${columnEntity.name}" VARCHAR(200)<#if columnEntity.defaultValue??> DEFAULT '${columnEntity.defaultValue}'</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "ATTACHMENT">
            "${columnEntity.name}" VARCHAR(4000)<#if columnEntity.defaultValue??> DEFAULT '${columnEntity.defaultValue}'</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "TEXT">
            "${columnEntity.name}" VARCHAR(4000)<#if columnEntity.defaultValue??> DEFAULT '${columnEntity.defaultValue}'</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "LONGTEXT">
            "${columnEntity.name}" LONG<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "BLOB">
            "${columnEntity.name}" BLOB<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#elseif columnEntity.dataType == "LONGBLOB">
            "${columnEntity.name}" BLOB<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity_has_next>,</#if>
          <#else>
            "${columnEntity.name}" VARCHAR(200)<#if columnEntity.defaultValue??> DEFAULT ${columnEntity.defaultValue}</#if><#if columnEntity.nullable != true> NOT NULL</#if><#if columnEntity.indexType?? && columnEntity.indexType == "PRIMARY"> PRIMARY KEY</#if><#if columnEntity_has_next>,</#if>
          </#if>
        </#list>
        );
        
        <#list columnEntityList as columnEntity>
          <#if columnEntity.indexType?? && columnEntity.indexType == "UNIQUE">
            ALTER TABLE "${tableName}" ADD CONSTRAINT "${columnEntity.indexName}" UNIQUE("${columnEntity.name}");
          </#if>
        
          <#if columnEntity.indexType?? && (columnEntity.indexType == "INDEX" || columnEntity.indexType == "FULLTEXT")>
            CREATE INDEX "${columnEntity.indexName}" ON "${tableName}" ("${columnEntity.name}");
          </#if>
        </#list>
        
        <#if indexEntityList??>
          <#list indexEntityList as indexEntity>
            <#if indexEntity.indexType?? && indexEntity.indexType == "UNIQUE">
              ALTER TABLE "${tableName}" ADD CONSTRAINT "${indexEntity.name}" UNIQUE(<#list indexEntity.indexLineEntityList as indexLineEntity>"${indexLineEntity.columnEntity.name}"<#if indexLineEntity_has_next>,</#if></#list>);
            </#if>
        
            <#if indexEntity.indexType?? && (indexEntity.indexType == "INDEX" || indexEntity.indexType == "FULLTEXT")>
              CREATE INDEX "${indexEntity.name}" ON "${tableName}" (<#list indexEntity.indexLineEntityList as indexLineEntity>"${indexLineEntity.columnEntity.name}"<#if indexLineEntity_has_next>,</#if></#list>);
            </#if>
          </#list>
        </#if>
        
        COMMENT ON TABLE "${tableName}" IS '${caption}';
        
        <#list columnEntityList as columnEntity>
          COMMENT ON COLUMN "${tableName}"."${columnEntity.name}" IS '${columnEntity.caption}';
        </#list>
        

        #

        模版解析SQL


        首先保存元數(shù)據(jù)信息,下一步傳遞模版名稱和元數(shù)據(jù)model,動(dòng)態(tài)解析成創(chuàng)建表SQL語(yǔ)句,然后創(chuàng)建物理表,這樣元數(shù)據(jù)和物理表就關(guān)聯(lián)上了。運(yùn)行時(shí)通過(guò)解析元數(shù)據(jù)動(dòng)態(tài)生成insert,select,update,delete等SQL語(yǔ)句,零代碼實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)crud功能。


        public String processTemplateToString(String database, String templateName, Object dataModel) {
            String str = null;
            StringWriter stringWriter = new StringWriter();
            try {
                Configuration config = new Configuration(Configuration.VERSION_2_3_31);
                config.setNumberFormat("#");
                String templateValue = getTemplate(database, templateName);
                if (templateValue == null) {
                  return str;
                }
        
                Template template = new Template(templateName, templateValue, config);
                template.process(dataModel, stringWriter);
        
                str = stringWriter.getBuffer().toString().trim();
                log.info(str);
            } catch (Exception e) {
                e.printStackTrace();
                throw new BusinessException(ApiErrorCode.DEFAULT_ERROR, e.getMessage());
            }
        
            return str;
        }
        
        public List<String> toCreateTableSql(TableEntity tableEntity) {
          String createTableSql = processTemplateToString("create-table.sql.ftl", tableEntity);
        
          if (createTableSql == null) {
            throw new BusinessException(ApiErrorCode.DEFAULT_ERROR, "create-table.sql is empty!");
          }
        
          List<String> sqls = new ArrayList<String>();
          String[] subSqls = createTableSql.split(";");
          for (String t : subSqls) {
            String subSql = t.trim();
            if (!subSql.isEmpty()) {
              sqls.add(t);
            }
          }
        
          return sqls;
        }
        
        public Long create(TableDTO tableDTO) {
          TableEntity tableEntity = tableMapper.toEntity(tableDTO);
          //TODO
          Long tableId = crudService.create(TABLE_TABLE_NAME, tableEntity);
          List<String> sqlList = crudService.toCreateTableSql(tableEntity);
          for (String sql: sqlList) {
            execute(sql);
          }
          //TODO
          return tableId;
        }
        

        #

        修改表


        freemarker.png?包括表結(jié)構(gòu)和索引的修改,刪除等,和創(chuàng)建表原理類似。


        application.properties


        需要根據(jù)需要配置數(shù)據(jù)庫(kù)連接驅(qū)動(dòng),無(wú)需重新發(fā)布,就可以切換不同的數(shù)據(jù)庫(kù)。


        #oracle
        spring.datasource.url=jdbc:oracle:thin:@//localhost:1521/XEPDB1
        spring.datasource.driverClassName=oracle.jdbc.OracleDriver
        spring.datasource.username=crudapi
        spring.datasource.password=crudapi
        spring.datasource.initialization-mode=always
        spring.datasource.schema=classpath:schema.sql
        

        #

        小結(jié)


        本文主要介紹了crudapi支持oracle數(shù)據(jù)庫(kù)實(shí)現(xiàn)原理,并且以產(chǎn)品對(duì)象為例,零代碼實(shí)現(xiàn)了CRUD增刪改查RESTful API,后續(xù)介紹更多的數(shù)據(jù)庫(kù),比如MSSQL Server,Mongodb等。


        實(shí)現(xiàn)方式代碼量時(shí)間穩(wěn)定性傳統(tǒng)開(kāi)發(fā)1000行左右2天/人5個(gè)bug左右crudapi系統(tǒng)0行1分鐘基本為0

        綜上所述,利用crudapi系統(tǒng)可以極大地提高工作效率和節(jié)約成本,讓數(shù)據(jù)處理變得更簡(jiǎn)單!


        crudapi簡(jiǎn)介


        crudapi是crud+api組合,表示增刪改查接口,是一款零代碼可配置的產(chǎn)品。使用crudapi可以告別枯燥無(wú)味的增刪改查代碼,讓您更加專注業(yè)務(wù),節(jié)約大量成本,從而提高工作效率。 crudapi的目標(biāo)是讓處理數(shù)據(jù)變得更簡(jiǎn)單,所有人都可以免費(fèi)使用! 無(wú)需編程,通過(guò)配置自動(dòng)生成crud增刪改查RESTful API,提供后臺(tái)UI管理業(yè)務(wù)數(shù)據(jù)?;谥髁鞯拈_(kāi)源框架,擁有自主知識(shí)產(chǎn)權(quán),支持二次開(kāi)發(fā)。


        demo演示


        crudapi屬于產(chǎn)品級(jí)的零代碼平臺(tái),不同于自動(dòng)代碼生成器,不需要生成Controller、Service、Repository、Entity等業(yè)務(wù)代碼,程序運(yùn)行起來(lái)就可以使用,真正0代碼,可以覆蓋基本的和業(yè)務(wù)無(wú)關(guān)的CRUD RESTful API。

        官網(wǎng)地址:https://crudapi.cn


        測(cè)試地址:https://demo.crudapi.cn/crudapi/login


        附源碼地址


        GitHub地址


        https://github.com/crudapi/crudapi-admin-web


        Gitee地址


        https://gitee.com/crudapi/crudapi-admin-web

        由于網(wǎng)絡(luò)原因,GitHub可能速度慢,改成訪問(wèn)Gitee即可,代碼同步更新。




        瀏覽 38
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            综合欧美国产视频二区| 久久大陆| 亚洲欧洲精品成人久久曰影片| 色婷婷黄色| 少妇一级| 18禁黄网| www.6969成人片亚洲| 午夜福利视频网| 国产色悠悠| 2024av在线| 免费成人在线网站| 久久午夜一级A片| 欧美曰皮免费看| av无码高清| 最新日韩在线| 欧美一在线一综合| 亚洲欧洲日韩综合| 无码成人AV在线看免费| 91三级片在线观看| 日本色色网| 欧美爱爱网站| 人妻精品一区二区三区| 在线观看中文字幕无码| BBW老熟女BBw| 天天看高清无码| 免费无码成人片在线播放| 国产精品久久久久久最猛| 在线看国产| 无码成人毛片| 日韩性爱AV| 欧美在线观看一区二区| 精品视频免费观看| 日韩av电影免费在线观看| 97人妻精品一区二区三区视频| 日本成人激情视频| 国产成人无码区亚洲A片356p | 黄色美女视频网站| 国产激情综合在线| 欧美日在线| 夜夜爽7777精品国产三级| 亚洲人妻AV| 天天爽夜夜爽夜夜爽精品| 亚洲中文在线视频| 免费A在线| 成人片天天看片欧美一级| 日韩无码五月天| 天堂91| 亚洲1区2区| 加勒比无码综合| 丁香五月色| 大香蕉伊人视频在线观看| 性BBwBBwBBwBBw禽| 国产操逼图| 无码av网站| 久久久久久五月天| 有码在线播放| 中文字幕观看在线| 在线观看AV资源| 中文字幕AV在线播放| 五月天精品| 91久| 国产香蕉精品视频| 91人体视频| 精品91海角乱| 草逼视频免费看| 国产欧美日韩综合| 久久久久亚洲AV成人网人人软件| 88av在线播放| 日韩无码不卡| 色网站在线观看| 97精品人妻一区二区三区香蕉农| 免费A片在线观看| 在线观看视频亚洲| 婷婷久久综合| 欧美在线免费观看| 东京热第一页| 亚洲无码视频在线| www.99视频| 一级黄片免费视频| 日本欧美在线观看高清| 日韩精品成人无码免费| 国产熟女在线| 蕉蕉视| 成人午夜毛片| 91在线无码精品在线看| 免费AV黄色| 大香蕉网视频| 国产精品theporn| 国产欧美一| 尤物视频网址| 亚洲国产熟妇无码日韩| 人妻毛片| av久| 男人网站| 成人黄色视频网站在线观看| 成人动漫免费观看| 人人摸人人草| 免费网站观看www在线观看| 五月六月婷婷| 日本视频爱爱| 插进去综合网| 99免费观看视频| 手机看片亚洲| 亚洲另类av| 国产激情小视频| 影音先锋av资源网站| 国产精品乱伦片| 中文字幕高清在线中文字幕中文字幕 | 国产精品1区2区3区| 草逼美女| 亚洲狠狠操| 欧美性性生交XXXXX无码| 北条麻妃中文字幕旡码| 秋霞无码一区二区三区| 国产无码激情视频| 国产成人精品123区免费视频| 国产无码高清在线| 国产一级电影网站| 色墦五月丁香| 日逼www| 91av久久| 成人免费视频一区二区三区| 蜜桃视频网站在线观看| 免费一区二区三区四区| 怡春院在线| 处破女初破全过免费看| 午夜专区| 日韩AV免费网站| 日韩中文字幕在线| 无码久久久| 亚洲欧美高清| 亚洲性无码| 人人摸人人摸人人| 欧洲三级片网站| 免费黄色av| 青娱乐网| 亚洲特级毛片| 成人视频你懂的| 无码熟妇人妻无码AV在线天堂| 伊人三级| 国产成人精品八戒| 大香蕉操逼| 福利视频亚洲| 国产AV资源网| 五月天婷婷丁香网| 精品999999| 无码欧美人XXXXX日本无码| 狠狠色AV| 亚洲成人自拍| 天天插天天插| 国产一区二区三区免费视频| 亚洲天码中字| 精品人伦一区二区三区| 337P粉嫩大胆噜噜噜55569| 蜜芽成人在线视频| 国产精品无码一区二区三| 日韩视频播放在线综合| 三级片视频网站| 无码人妻丰满熟妇区毛片视频| 天天草天天| 天天摸天天看| 国产成人自拍视频在线观看| 另类BBwBBw| 91AV一区二区三区| 最新毛片网站〖网:.〗| 色色视频免费看| 色婷婷一区二区三区四区五区精品视 | 亚洲日韩免费观看| 想要xx在线观看| 欧美色逼逼| 黄色一级大片在线免费看产| 人妻一区二区在线| 在线看毛片网站| 色狠狠AV| 亚洲成人免费在线视频| 国产成人无码区免费视频| 欧美一区| 影音先锋资源| 国产精品久久久久久久久免费无码 | 日欧无码| 亚洲国产激情视频| 乌克兰性爱视频| 日韩中文字幕网| 五月天婷婷成人| 91大神shunv| 成人性爱免费网站| 在线无码中文字幕| 男人操女人免费网站| 你懂的在线免费观看| 欧美+日韩+国产+成人+在线| 在线观看免费a片| 中文字幕无码一区二区三区一本久 | 日日夜夜精选视频| 亚洲69v久久久无码精品| 大地影视官网第三页入口| 成人无码影院日韩,成人年…| 精品秘一区性综合三区| 国产精品中文字幕在线观看| 人妻丰满精品一区二区| 欧美精品成人网站| 熟女资源网| 在线性视频| 91网站在线观看视频| 香蕉视频日韩| 国产99精品视频| 91在线不卡| 天天日,天天干,天天操| 午夜成人福利剧场| 亚洲午夜在线| 中文熟女| 国精品伦一区一区三区有限公司| 欧美精品久久| 黄片大全在线观看| 国产毛片视频| 高清一区二区| 偷拍92| 另类色| 岛国免费视频| 人妻无码中文字幕蜜桃| 精品视频导航| 日韩在线观看免| 秋霞欧美在线| 黄色电影大香蕉| 韩日一区二区三区| 最新国产视频| 白嫩外女BBWBBWBBW| 色综合久久88色综合天天| 蜜桃视频网站| 亚洲狠狠| 一本视频| 精品秘一区性综合三区| 久色婷婷| 中文字幕一区二区三区日本在线 | 国产一级自拍| a片免费在线| 亚洲午夜福利在线| 在线免费观看黄| 国产激情视频在线观看| 四虎最新视频| 亚洲影院第一页| 丰满人妻一区二区三区46| 欧美性爱A| 夜夜爽妓女77777毛片A片| www.精品视频| 国产电影一区二区三区| 国产三级在线| 日本精品在线观看视频| 免费日批网站| 伊人综合大香蕉| 久操操| 免费a级毛片| 激情片AAA| 日本免费一二三区| 一本加勒比HEZYO东京热无码| 黑人猛躁白人BBBBBBBBB| 色五婷婷| 日本Sm/调教/捆绑/紧缚| 淫荡97| 欧美中文字| 7799精品视频天天看| 视频二区中文字幕| 特级黄色片| 免费的黄色录像| 无码色网| 东北老女人操逼| 草草网站| 欧美乱伦视频| 久久艹精品视频| 影音先锋成人AV资源| 无码国产一区二区三区四区五区| 日韩黄片视频| 久久久久久国际四虎免费精品视频 | 黄色三级视频| www国产| 亚洲秘无码一区二区三区电影| 国产精品秘久久久久久1-~/\v7-/ 囯产精品一区二区三区线一牛影视1 | av天堂亚洲| 久久性爱视频| 九热视频| 日韩在线观看视频网站| 亚洲AV在线免费观看| 四虎国产精品成人久久| 色色网的五月天| 热久久这里只有精品| 天天操天天拍| 激情小视频在线| 影音先锋中文字幕av| 日本伊人大香蕉| 天天操天天日天天干| 亚洲欧美激情小说另类| 成人毛片18女人毛片真水| 91人人草| 色五月婷婷AV| 俄罗斯老熟妇与子伦| 亚洲色久悠悠| 超碰亚洲| 亚洲最新在线观看| 日韩大片在线观看| 不卡在线视频| 黄色网页免费观看| 求欧美精品网址| 久久er热| 专肏老妇人大逼| 国产高潮白浆喷| 99啪啪| 自拍偷拍福利视频网站| 操比视频在线观看| 久艹视频在线观看| 亚洲成人黄色在线| 十八禁黄网站| 色婷婷视频在线观看| 北条麻妃免费视频| 日批免费视频| 黑巨茎大战欧美白妞| 操逼免费视频网站| 国产黄色免费乱伦片| 一级做a爰片毛片A片| a片在线观看视频| 黄片免费观看网站| 日韩不卡高清在线观看视频 | 日韩成人AV电影| 一级特黄大片色| 黄色电影免费网站| 欧美国产性爱| 香蕉久久久| 久久日精品| 亚洲色图另类| 按摩忍不住BD中文字幕| 精品黄色电影| 日本无码一区二区三区| 热久久国产| www.精品视频| 天天日天天日天天日| 日B无码| 超碰超碰| 黄色A级视频| 91蜜桃在线| 亚洲a在线视频| 乱子伦国产精品视频| 天天扣天天操| 欧美日韩黄色片| 亚洲性爱网站| 三级91| 四川少妇搡bbbbb搡多人| 亚洲福利一区二区| 中文字幕国产精品| 99久久国内精品成人免费| 天天天天日天天干| 国产无码电影| 91无码一区二区三区| 国模精品无码一区二区免费蜜桃| 国产成人69免费看| 西西4444www大胆无| 美女裸体网站国产| 欧美色色色色色| 一级a片在线免费观看| 波多野结衣av中文字幕| 国产美女一级特黄大片| 国产精品三级视频| 香蕉国产AV| 91狠狠色丁香婷婷综合久久精品| 外国成人视频| 日韩成人无码免费视频| 国产精品色在线回看| 色噜噜狠狠一区二区三区牛牛影视 | 暖暖无码| 黄色一级片在线看| 97在线观看免费| 国产精品伦子伦免费视频| 四川女人毛多水多A片| 好逼天天操| 岛国av在线播放| 国产福利在线导航| 在线观看日本vs欧洲vs美洲| 肏屄视频在线看| 在线观看污视频| 日韩精品视频免费在线观看| 操东北老女人| 少妇搡BBBB搡BBB搡HD(| 国产亚洲视频完整在线观看| 亚洲成人综合网站| 黄色免费在线观看网站| 俺去俺来也www色官网cms| 中文字幕H| 人人天天夜夜| 国产黄色片在线播放| 天天干天天操天天| 日韩国产| 欧美曰皮免费看| 色五月婷婷在线| 巨乳一区二区三区| 黄色91| 靠逼网站免费观看| 欧美,日韩,日| 黄页网址在线观看| 北条麻妃精品视频| H片在线免费观看| 九色PORNY丨自拍蝌蚪| 大香蕉久久视频| 日韩欧美一级视频| 亚洲1234区| 日本黄色视频在线播放| 麻豆AV免费看| 久久久精品黄色网址| 无码白浆| 亚洲毛片亚洲毛片亚洲毛片 | 亚洲AV永久无码精品| 草草影院第一页YYCCC| 国产成人免费| 免费在线观看黄视频| 日韩天堂在线播放| 中文字幕在线观看av| 日韩欧美中文字幕在线视频| 麻豆疯狂做受XXXX高潮视频| 乱伦视频网站| 中文字幕在线一区二区a| 18禁片网站| 日日夜夜av| 91人妻人人爽人人澡| 国内精产品一二区秘| 人妻少妇无码视频| 男人V天堂| 日韩三级片AV| 日韩成人在线播放| 久久免费视频6| 色婷婷亚洲色| 婷婷五月激情网| 日韩乱伦av| 国产在线视频第一页| 日韩免费视频在线观看| 911精品人妻一区二区三区A片| 先锋资源国产| 亚洲中文字幕av| 青春草在线视频观看| 欧美成人手机在线看片| 亚洲综合免费观看高清完整| 五月天黄色小说| 无码欧美成人| 另类激情网| 亚洲aaa| 专业操老外| 婷婷伊人中文字幕| 我要操视频| 在线免费看黄片| 强开小嫩苞一区二区电影| 99久久精品国产成人一区二区| 久久亚洲日韩天天做日日做综合亚洲 | 午夜激情在线观看| 午夜福利10000| 色欲av网站| 啊哈嗯| a视频在线观看| 中文在线a√在线8| 色五月激情网| 精品网站| 精品无码一区二区三区四区久久久软件 | 中国老熟妇| 欧美色图另类| 久久免费在线视频| 台湾精品一区二区三区| 日本亚洲欧洲免费| 天堂资源在线| 国产1区2区3区| 波多无码在线| 男人视频网站| 日韩一区二区三区在线视频| 无码精品一区| 伊人网在线视频观看| 中文字幕第69页| 东方av在线播放| 色99在线| 在线观看国产区| 欧美做爱网站| 亚洲中文字幕视频在线观看| 国产探花| 美女A级毛片| 牛牛无码| 五月激情婷婷基地| 成人电影一区二区三区| 在线视频日韩| 免费观看成人| 韩日一区二区三区| 黄av在线| 在线观看免费a片| 中文无码日本高潮喷水| 亚洲AV成人片色在线观看麻豆| 东北毛片| 91欧美日韩综合| 三级片日韩| 免费久草视频| 中文精品在线| 欧美韩日一区二区| 国产欧美一| 免费的黄色录像| 在线免费观看黄片| 国产熟妇婬乱一区二区| 亚洲无码自拍偷拍| 国产免费www| 午夜国产在线视频| 亚洲精品一区中文字幕乱码| 婷婷五月天黄色| AV无码电影| 午夜福利视频91| 日本狠狠干| 色婷婷国产精品视频| 中文字幕在线视频日本| 成人777777| 天堂网免费视频| 尤物一区二区| 黄色视频在线免费观看高清视频| 波多野结衣视频在线播放| 久久久久久av| 在线视频你懂得| 波多野成人无码精品69| 国产1区2区3区| 亚洲视频中文字幕| 爆操人妻| 日韩操操操| 麻豆性爱视频| 国产黄色性爱视频| www.俺去了| 日韩免费视频观看| 四虎黄色影院| 琪琪av| 日韩不卡AV| 香蕉视频成人在线| 3d动漫精品一区二区三区在线观看 | 免费中文字幕视频| 嫩草视频在线观看免费网站| 国产精品欧美综合在线| 粉嫩AV蜜乳AV蜜臀AV蜂腰AV| 九九精品12| 久久婷视频| 少妇无码中文| 亚洲色视频在线观看| 欧美成人精品无| 久久99精品国产.久久久久| 国产欧美一区二区三区国产幕精品 | 成人做爰A片一区二区app| a视频在线免费观看| 三级片久久久| 看毛片的网站| 人妻在线观看| 麻豆性爱| 欧美丝袜脚交xxxxBH| 国产牛牛在线| 国产乱伦熟女| 欧美熟女内射| 人妖和人妖互交性XXXX视频 | 国产AV影片| 久草视| 四虎高清无码| 操逼影视| 蜜芽成人网站| 亚洲激情视频在线观看| 国产精品免费一区二区三区都可以| 翔田千里中文字幕无码| 亚洲GV成人无码久久精品| 久久中文字幕视频| 色五月婷婷基地| 中文无码观看| 夜色视频网| 日本高清视频免费观看| 日韩一级黄色毛片| 黄色在线| 成人在线乱码视频| 欧美成人片免费看| 天天干,夜夜操| 麻豆AV在线| 强开小嫩苞一区二区电影| 2025AV天堂网| 色色免费视频| 人妻熟女字幕一区二区| 欧美狠狠| 伊人网在线视频| 伊人三区| 国产三级成人| 人妻丰满熟妇av无码| 久久无码专区| 成人一级a片| 婷婷深爱五月| 婷婷五月天网址| 操逼影视| 青青草超碰| 国产激倩都市一区二区三区欧美| 欧美视频在线免费| 日韩操比视频| 色婷在线视频| 41ts午夜福利| 精品成人A片久久久久久不卡三区 免费看成人A片无码照片88hⅤ | 91青青草视频| 国语对白做受欧美| 18AV在线观看| 国产AV不卡| 久艹视频在线观看| 欧美黄片免费视频| 国产精品人人人人| 色婷婷影视| 国产精品夜夜爽7777777| 亚洲综合中文| 偷拍92| 黄色大片视频| 丁香婷婷激情| 国产福利精品视频| 亚洲国产成人精品女人久久久| 巨爆乳肉感一区二区三区视频| 在线观看亚| 911精品人妻一区二区三区A片| 国模在线| 91激情在线| 欧美一级免费视频| 欧美自拍视频在线| 国产一二三| 无码国产精品一区二区| 黄片视频在线免费播放| 日韩无码免费电影| 国产精品国产精品国产专区| 欧洲三级片| 日本少妇中文字幕| 青春草在线免费视频| 91九色在线观看| 欧美熟妇精品一二三区| 老女人肏屄视频| 亚洲.欧美.丝袜.中文.综合 | 日本少妇BBW| 欧美三区| 伊人综合干| 嫩草久久99www亚洲红桃| 欧美性爱91| gogogo高清在线观看免费直播中国| 在线播放a| 51国产黑料吃瓜在线入口| 欧美不卡一区| 欧美高清国产| 天堂婷婷| 超碰精品在线| 无码精品一区二区三区在线播放| 麻豆传媒免费观看| 精品一级| 人人爱人人妻人人操| 人人操人人爽人人妻| HEZ-502搭讪绝品人妻系列 | AAA片视频| 欧美啪啪啪| 婷婷在线视频| 91国内产香蕉| 性无码一区二区| 麻豆免费版在线观看| 亚洲xx网| 日韩高清无码电影| 国产精品久久久久久久久久二区三区 | 中文字幕码精品视频网站| 亚洲精品国产AV婷婷| 91小仙女jK白丝袜呻吟| 五月婷婷日韩| 黄色一级片免费观看| 三级黄色视频| 久草精品在线| 亚洲国产成人无码a在线播放| 99精品丰满人妻无码| 自慰喷水流白浆中文字幕| 日韩成人免费在线| 安徽妇搡BBBB搡BBBB| 嘿咻无码推油| 九色91PORNY国产| 日逼电影网| 综合导航无码| 天天躁夜夜躁av| 欧美成人h| 色老板在线精品免费观看| 日本中文字幕亚洲| 影音先锋成人网| 日韩欧美大香蕉| 桃色一区| 自拍偷拍免费| 一级大片免费看| 爱视频福利| 欧美草比视频| 欧美午夜精品成人片在线播放| avcom无码| 欧美成人三级在线播放| 中文字幕在线观看日韩| 国产精品视频久久久久| 色综合天天综合成人网| 特级西西人体444WWw高清大胆| 国产亚洲无码激情| 先锋影音AV资源网| 欧美在线日韩在线| 色中色在线视频| 午夜精品18视频国产17c| 国产精品高| 大香蕉综合在线| 黄色国产视频在线观看| 国产2区| 亚洲网站在线免费观看| 人妻熟女一区二区| 色射影院| 激情深爱五月| 国精品无码人妻一区二区三区免费| 精品人妻一区二区三区阅读全文| 国产成人A片| 曰曰操| 国产色av| 嫩BBB搡BBB搡BBB四川| 成人色色网| 一区二区国产视频| 欧美三级欧美一级| 久久久久久无码精品亚洲日韩麻豆 | 久久精品三级片| 你懂的在线免费观看| 性生活毛片| 国产精品人人人人| 国产jk在线观看| 波多野结衣无码AV专区| 久草新在线| 91丨精品丨国产丨丝袜| 中文字幕日韩在线视频| 我要看黄色一级片| 波多野结衣无码AV在线| 浮力影院av| 青青草原AV| 午夜免费小视频| 99久久99| 天堂在线观看av| 国产午夜视频| 在线观看黄视频| 欧美精品A级片| 狠狠干五月天| 国产女同在线观看| 美女网站在线观看| 无码欧美人XXXXX日本无码| 狠狠狠狠狠狠| 边添小泬边狠狠躁视频| 成人在线视频免费观看| 国产亲子乱XXXXimim/| 一级调教看片| 久久精品夜色噜噜亚洲A∨| 天堂无码视频在线播放| 人妻一区| 无套内射在线| 国产综合久久| 乱子伦毛片国产| 中文无码日韩| 欧美图片小说| 九热视频| 在线视频a| 色欲91| 天天谢天天干| 午夜福利资源| 色999亚洲人成色| 伊人网在线播放| 人人爽久久涩噜噜噜网站| 亚洲高清视屏| 国产网站在线| 乱伦乱码| 欧美精品A级片| JiZZjiZZ亚洲成熟熟妇| 18性XXXXX性猛交| 日韩黄色毛片| 日本老熟妇| 水果派解说AV无码一区| 国产123区| 麻豆乱伦视频| 日韩v欧美v日本v亚洲v国产v| 久久女人视频| 精品人妻一区二区免费蜜桃| 久久午夜无码鲁丝片午夜精品偷窥| 国产成人在线免费| 黄色av网站免费| 肏屄视频在线观看| 最新国产视频| 国产一区二区在线播放| 亚洲中文字幕在线播放| 亚洲一区在线免费观看| 你懂的在线免费观看| 高清无码免费| 黄片视频在线免费观看| 中文字幕巨肉乱码中文乱码| 久久人妻无码| 东北女人操逼| 一本无码中文字幕| 日韩精品黄片| 亚洲中文字幕一区| 亚洲电影无码| 国产自慰一区| 欧美在线成人网| 日本精品一区二区三区四区的功能| 精品视频在线观看免费| 人人操人人看人人干| 日韩黄色毛片| 不卡的av在线| 伊人青青操| 免费无码婬片A片AA片| 亚洲人妻中文字幕| 国产熟妇毛多久久久久一区| 色婷在线视频| 五月色视频| 中文字幕无码AV| 免费操逼视频在线观看| 91无码人妻精品1国产四虎| 亚洲久久色| 91久久国产综合久久| 北条麻妃无码精品| 激情久久av| 亚洲中文字幕无码在线观看| 91蜜桃婷婷狠狠久久综合9色| 亚洲无码小电影| 国产av地址| 人妻丰满精品一区二区| 特级毛片AAAAAA蜜桃| 在线国产视频| 国产成人AV在线播放| 五月天婷婷丁香网| 美女高潮网站| 秋霞亚洲| 天天干天天干天天| 蜜桃秘av一区二区三区安全| 无码成人精品| 成人性爱视频免费观看| 3D动漫精品啪啪一区二区| 特级丰满少妇一级AAAA爱毛片| 久久激情视频| 男人天堂视频在线观看| 91免费网站在线观看| 久久亚洲热| 欧美自拍视频| 日韩18禁| 青草青视频| 成人一级黄片| 精品人妻二区三区蜜桃| 男女AV网站| 在线视频观看一区| 婷婷国产成人精品| 成年人视频网站| 51黄片库| 香蕉网址| 理论片91| 可以免费看的AV| 性色在线| 国产3p露脸普通话对白| 波多野结衣无码NET,AV| 日韩精品欧美一区二区三区| 国产精品成人AV在线| 黄网站免费在线观看| 授乳奶水x88MAV| 国产无码AV在线| 桃花岛tⅴ+亚洲品质| 69福利社| 久久五月天视频| 日韩美女做爱| 欧美性爱香蕉视频| 亚洲无码影视| 六月伊人| 国产AV无码成人精品毛片| 免费三级网站| 激情深爱| 亚人精品中文字幕在线观看| 亚洲视频欧美| 中文字幕亚洲视频在线观看| 中文字幕第一页av| 国产又爽又黄视频| 久久久久久亚洲AV黄床| 96精品久久久久久久久久| 豆花成人在线| 久久人操| 午夜精品久久久久久不卡8050| 国产无套进入免费| 日韩精品成人| 青春草视频在线观看| 中文字字幕在线中文乱码电影| 日韩精品123| 91探花视频精选在线播放| 天天添天天操| 国产视频你懂的| 六月丁香激情| 97人人爽人人爽人人人| 日韩无码一区二区三区四区| 2018天天干天天操| 黄色二区| 北条麻妃无码精品AV| 性插视频| 91精品国产综合久久蜜臀使用方法 | 黄色毛片在线观看| www.水蜜桃| 色欲AV在线| 国产区在线观看| 豆花视频在线| 国产激情在线观看| 胖老板办公室沙发无套爆秘书| 亚洲男人天堂| 日本人人操人人摸| 女BBBBBB女BBB| 欧美大鸡| 中文字幕人成人乱| 国外操逼视频| 国产女人水真多18毛片18精品| 亚洲无码中文字幕视频| 特级西西WWW无码| 久久群交| 91人妻无码精品一区二区三区 |