精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

NestJS中如何優雅的實現接口日志記錄

開發 前端
在我們系統開發中,通常會需要對接口的請求情況做一些日志記錄,通過詳細的日志記錄,我們可以獲取每個接口請求的關鍵信息。本篇文章將介紹如何在 NestJS 中優雅的實現接口日志記錄。

在我們系統開發中,通常會需要對接口的請求情況做一些日志記錄,通過詳細的日志記錄,我們可以獲取每個接口請求的關鍵信息,包括請求時間、請求參數、請求主機、以及用戶身份等。這些信息將為后續的性能優化、故障排查和用戶行為分析提供重要依據。本篇文章將介紹如何在 NestJS 中優雅的實現接口日志記錄。

什么是 AOP

在開始之前,我們需要了解一下什么是 AOP 架構?

我們首先了解一下 NestJS 對一個請求的處理過程。在 NestJS 中,一個請求首先會先經過控制器(Controller),然后 Controller 調用服務 (Service)中的方法,在 Service 中可能還會進行數據庫的訪問(Repository)等操作,最后返回結果。但是如果我們想在這個過程中加入一些通用邏輯,比如日志記錄,權限控制等該如何做呢?

這時候就需要用到 AOP(Aspect-Oriented Programming,面向切面編程)了,它允許開發者通過定義切面(Aspects)來對應用程序的各個部分添加橫切關注點(Cross-Cutting Concerns)。橫切關注點是那些不屬于應用程序核心業務邏輯,但在整個應用程序中多處重復出現的功能或行為。這樣可以讓我們在不侵入業務邏輯的情況下來加入一些通用邏輯。也就是說 AOP 架構允許我們在請求的不同階段插入代碼,而不需要修改業務邏輯的代碼。

NestJS 中的五種實現 AOP 的方式有Middleware(中間件)、Guard(導航守衛)、Pipe(管道)、Interceptor(攔截器)、ExceptionFilter(異常過濾器),感興趣的可以查看相關資料了解這些AOP。本篇文章將介紹如何使用Interceptor(攔截器)來實現接口日志記錄。

然后看一下我們的需求,我們需要記錄每個接口的請求情況,包括請求時間、請求參數、請求主機、以及用戶身份等。我們肯定是不能在每個接口中都去手動的去添加日志記錄的,這樣會非常的麻煩,而且也不優雅。所以這時候我們就可以使用 AOP 架構中的Interceptor(攔截器)來實現接口日志記錄。攔截器可以在請求到達控制器之前或之后執行一些操作,我們可以在攔截器中記錄接口的請求情況,這樣就可以實現接口日志記錄了。

日志記錄模塊實現

首先我們需要生成一個日志記錄模塊,用于記錄接口的請求情況。在NestJS中執行nest g res log就可以自動生成一個模板。然后新建log/entities/operationLog.entity.ts文件,用于定義日志記錄的實體類。

import * as moment from "moment";
import {
  Column,
  CreateDateColumn,
  Entity,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from "typeorm";
//操作日志表
@Entity("fs_operation_log")
export class OperationLog {
  @PrimaryGeneratedColumn()
  id: number; // 標記為主鍵,值自動生成
  @Column({ length: 100, nullable: true })
  title: string; //系統模塊
  @Column({ length: 20, nullable: true })
  operation_type: string; //操作類型
  @Column({ length: 20, nullable: true })
  method: string; //請求方式
  @Column({ type: "text", nullable: true })
  params: string; //參數
  @Column({ nullable: true })
  ip: string; //ip
  @Column({ type: "text", nullable: true })
  url: string; //地址
  @Column({ nullable: true })
  user_agent: string; //瀏覽器
  @Column({ nullable: true })
  username: string; //操作人員
  @CreateDateColumn({
    transformer: {
      to: (value) => {
        return value;
      },
      from: (value) => {
        return moment(value).format("YYYY-MM-DD HH:mm:ss");
      },
    },
  })
  create_time: Date;

  @UpdateDateColumn({
    transformer: {
      to: (value) => {
        return value;
      },
      from: (value) => {
        return moment(value).format("YYYY-MM-DD HH:mm:ss");
      },
    },
  })
  update_time: Date;
}

啟動項目后,在數據庫中就會自動生成fs_operation_log表了。

然后在log/log.module.ts文件中通過@Global將這個模塊注冊為全局模塊,并導入這個實體類,同時將LogService導出,這樣就可以在其它模塊中使用了。

import { Global, Module } from "@nestjs/common";
import { LogService } from "./log.service";
import { LogController } from "./log.controller";
import { OperationLog } from "./entities/operationLog.entity";
import { TypeOrmModule } from "@nestjs/typeorm";

//全局模塊
@Global()
@Module({
  controllers: [LogController],
  providers: [LogService],
  imports: [TypeOrmModule.forFeature([OperationLog])],
  exports: [LogService],
})
export class LogModule {}

最后在log/log.service.ts文件中定義一個saveLog方法,用于保存日志記錄。

import { Injectable } from '@nestjs/common';
import { OperationLog } from './entities/operationLog.entity';
import {Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { ApiException } from 'src/common/filter/http-exception/api.exception';
import { ApiErrorCode } from 'src/common/enums/api-error-code.enum';

@Injectable()
export class LogService {
    constructor(
        @InjectRepository(OperationLog)
        private readonly operationLog: Repository<OperationLog>
    ) { }
    // 保存操作日志
    async saveOperationLog(operationLog: OperationLog) {
        await this.operationLog.save(operationLog);
    }

}

這樣我們就完成了日志記錄模塊的實現了。后面我們會在攔截器中調用這個方法來實現接口日志的記錄。

攔截器實現

新建src/common/interceptor/log.interceptor.ts文件,用于實現攔截器。在攔截器中可以通過context.switchToHttp().getRequest()獲取到請求相關信息。同時我們可以通過context.getHandler()獲取到當前控制器的元數據,從而獲取到控制器中自定義裝飾器定義的模塊名。

首先看一下自定義裝飾器@LogOperationTitle

src/common/decorator/oprertionlog.decorator.ts文件中定義了一個@LogOperationTitle裝飾器,用于標記當前控制器的模塊名。

import { SetMetadata } from "@nestjs/common";

// 操作日志裝飾器,設置操作日志模塊名
export const LogOperationTitle = (title: string) =>
  SetMetadata("logOperationTitle", title);

簡單來說就是使用@LogOperationTitle裝飾器可以定義模塊名稱(logOperationTitle),然后在攔截器中獲取到這個模塊名稱。然后看下自定義攔截器的實現。

//操作日志攔截器
import {
    Injectable,
    NestInterceptor,
    ExecutionContext,
    CallHandler,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { LogService } from 'src/log/log.service';
import { OperationLog } from 'src/log/entities/operationLog.entity';
import { Reflector } from '@nestjs/core';
export interface Response<T> {
    data: T;
}

@Injectable()
export class OperationLogInterceptor<T>
    implements NestInterceptor<T, Response<T>>
{
    constructor(
        private readonly logService: LogService,
        private readonly reflactor: Reflector,
    ) { }
    intercept(
        context: ExecutionContext,
        next: CallHandler,
    ): Observable<Response<T>> {
        //獲取請求對象
        const request = context.switchToHttp().getRequest();
        //獲取當前控制器元數據中的日志logOperationTitle
        const title = this.reflactor.get<string>('logOperationTitle', context.getHandler());
        return next
            .handle().pipe(tap(() => {
                const log = new OperationLog();
                log.title = title;
                log.method = request.method;
                log.url = request.url;
                log.ip = request.ip;
                //請求參數
                log.params = JSON.stringify({ ...request.query, ...request.params, ...request.body });
                //瀏覽器信息
                log.user_agent = request.headers['user-agent'];
                log.username = request.user?.username;
                this.logService.saveOperationLog(log).catch((err) => {
                    console.log(err);
                });

            }
            ));
    }
}

這樣我們就完成了攔截器的實現了。

使用攔截器

因為我們需要在每個請求中都用到這個攔截器,所以我們可將其定義為全局攔截器。前面文章中我們介紹過可以在main.ts文件中通過app.useGlobalInterceptors(new OperationLogInterceptor())將攔截器注冊為全局攔截器,但是這樣會出現一個問題,就是我們在log/log.module.ts文件中定義的LogService服務無法在攔截器中使用,因為攔截器是沒有依賴注入的,所以我們需要在app.module.ts文件中通過APP_INTERCEPTOR提供者將攔截器注冊為全局攔截器,這樣才可以在攔截器中使用LogService服務了。

import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
import { OperationLogInterceptor } from './common/interceptor/log/log.interceptor';
//此處省略其它代碼
@Module({
    providers: [AppService,
    // 注冊全局攔截器
    {
      provide: APP_INTERCEPTOR,
      useClass: OperationLogInterceptor,
    }
  ],
})

此時啟動項目我們的攔截器就已經生效了。比如隨便訪問幾次菜單查詢的接口,就可以在數據庫看到日志記錄已經成功了。

圖片

但是你會發現模塊名還是空的,因為我們還沒有在控制器中使用@LogOperationTitle裝飾器來定義模塊名。所以我們需要在控制器中使用@LogOperationTitle裝飾器來定義模塊名。比如在menu/menu.controller.ts文件中定義菜單查詢模塊名。

//菜單查詢
@Get()
@LogOperationTitle('菜單查詢')
async findAll() {
    return await this.menuService.findAll();
}

再次請求接口,就可以看到模塊名已經記錄成功了。

圖片

提供查詢日志接口

我們還需要提供一個查詢和導出日志接口給前端使用,用于查詢日志記錄。在log/log.controller.ts文件中定義一個查詢和導出日志接口。(導出功能前面文章已經介紹過了,這里就不詳細介紹了,感興趣的可以查看前面文章)

import { Controller, Get, Query, Res } from '@nestjs/common';
import { LogService } from './log.service';
import { FindListDto } from './dto/find-list.dto';
import { LogOperationTitle } from 'src/common/decorators/oprertionlog.decorator';
import { ApiOperation } from '@nestjs/swagger';
import { Permissions } from 'src/common/decorators/permissions.decorator';
import { Response } from 'express';
@Controller('log')
export class LogController {
  constructor(private readonly logService: LogService) { }

  //日志查詢
  @LogOperationTitle('日志查詢')
  @ApiOperation({ summary: '日志管理-查詢' })
  @Permissions('system:log:list')
  @Get('list')
  findLogList(@Query() findListDto: FindListDto) {
    return this.logService.findList(findListDto);
  }

  //日志導出
  @LogOperationTitle('日志導出')
  @ApiOperation({ summary: '日志管理-導出' })
  @Get('export')
  async export(@Query() findListDto: FindListDto, @Res() res: Response) {
    const data = await this.logService.export(findListDto);
    res.send(data);
  }
}

其中FindListDto類型為:

import { ApiProperty } from "@nestjs/swagger";
import { IsOptional } from "class-validator";

export class FindListDto {
    @ApiProperty({
        example: '模塊名稱',
        required: false,
    })
    @IsOptional()
    title?: string;

    @ApiProperty({
        example: '操作人',
        required: false,
    })
    @IsOptional()
    username?: string;
    @ApiProperty({
        example: '請求地址',
        required: false,
    })
    @IsOptional()
    url?: string;

    @ApiProperty({
        example: '結束時間',
        required: false,
    })
    end_time: string;

    @ApiProperty({
        example: '開始時間',
        required: false,
    })
    begin_time: string;
    @ApiProperty({
        example: '當前頁',
        required: false,
    })
    page_num: number;
    @ApiProperty({
        example: '每頁條數',
        required: false,
    })
    page_size: number;
}

前端可以通過這些參數來查詢日志記錄。

log/log.service.ts文件中實現findList方法和export方法。

import { Injectable } from '@nestjs/common';
import { OperationLog } from './entities/operationLog.entity';
import { Between, Like, Repository } from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { FindListDto } from './dto/find-list.dto';
import { ApiException } from 'src/common/filter/http-exception/api.exception';
import { ApiErrorCode } from 'src/common/enums/api-error-code.enum';
import { exportExcel } from 'src/utils/common';
import { mapLogZh } from 'src/config/excelHeader';
@Injectable()
export class LogService {
    constructor(
        @InjectRepository(OperationLog)
        private readonly operationLog: Repository<OperationLog>
    ) { }
    // 保存操作日志
    async saveOperationLog(operationLog: OperationLog) {
        await this.operationLog.save(operationLog);
    }
    // 分頁查詢操作日志
    async findList(findList: FindListDto) {
        const condition = {};
        if (findList.title) {
            condition['title'] = Like(`%${findList.title}%`);
        }
        if (findList.username) {
            condition['username'] = Like(`%${findList.username}%`);
        }
        if (findList.url) {
            condition['url'] = Like(`%${findList.url}%`);
        }
        if (findList.begin_time && findList.end_time) {
            condition['create_time'] = Between(findList.begin_time, findList.end_time);
        }
        try {
            const [list, total] = await this.operationLog.findAndCount({
                skip: (findList.page_num - 1) * findList.page_size,
                take: findList.page_size,
                order: {
                    create_time: 'DESC'
                },
                where: condition
            });
            return {
                list,
                total
            };
        } catch (error) {
            throw new ApiException('查詢失敗', ApiErrorCode.FAIL);
        }

    }
    //日志導出
    async export(findList: FindListDto) {

        try {
            const { list } = await this.findList(findList)
            const excelBuffer = await exportExcel(list, mapLogZh);
            return excelBuffer;
        } catch (error) {
            throw new ApiException('導出失敗', ApiErrorCode.FAIL);
        }
    }
}

這樣我們就完成了日志的查詢與導出接口。

前端實現

最后在前端調用接口實現日志的查詢與導出功能。最終實現的頁面如下:

圖片

感興趣的可以直接去源碼地址(https://github.com/qddidi/fs-admin)查看相關代碼實現。

責任編輯:龐桂玉 來源: web前端進階
相關推薦

2023-03-06 11:36:13

SpingBoot注解

2020-12-08 08:08:51

Java接口數據

2021-03-09 13:18:53

加密解密參數

2022-06-04 12:25:10

解密加密過濾器

2022-02-15 17:56:19

SpringBoot日志

2020-08-26 07:17:19

通信

2022-02-18 17:34:47

數組多維五維數組

2021-02-14 20:41:56

API日志web

2025-06-17 07:37:53

2024-11-07 10:55:26

2024-11-08 15:56:36

2022-06-21 14:44:38

接口數據脫敏

2024-09-27 12:27:31

2020-08-24 13:35:59

trycatchJava

2021-11-17 10:25:28

loguru日志Python

2022-01-10 09:35:50

日志語言解析器

2020-03-27 15:10:23

SpringJava框架

2023-03-23 22:46:38

Spring限流機制

2023-01-31 10:29:26

JavaScript國際化國際化庫

2024-01-17 10:16:22

前端國際化消息鍵
點贊
收藏

51CTO技術棧公眾號

欧洲精品久久久久毛片完整版| 亚洲色图21p| 久久久久久免费视频| 欧美大片拔萝卜| 美女av免费在线观看| 成人免费在线电影| 国产伦理精品不卡| 欧洲日韩成人av| 一级性生活免费视频| 久久草在线视频| 欧美午夜精品久久久| 欧美 日韩 国产精品| 你懂的在线网址| 国产一区二区三区综合| 欧美一级黑人aaaaaaa做受| 五月婷婷欧美激情| 欧美日韩另类图片| 日韩一卡二卡三卡四卡| 久久久久久久久久久免费视频| а天堂中文在线官网| 久久综合视频网| 91一区二区三区| 青青艹在线观看| 亚洲精品美女91| 欧美成人精品在线播放| 伊人影院综合网| 亚洲性视频大全| 精品国产91洋老外米糕| 天堂av.com| 亚洲mmav| 色老汉av一区二区三区| 欧美乱大交xxxxx潮喷l头像| 大片免费在线看视频| 欧美激情自拍偷拍| 久久精品magnetxturnbtih| av中文字幕第一页| 久久狠狠亚洲综合| 国产精品美腿一区在线看| 欧美bbbbbbbbbbbb精品| 欧美色一级片| 久久最新资源网| 美国美女黄色片| 国产午夜一区| 亚洲精品视频网上网址在线观看| 在线观看你懂的视频| 深夜日韩欧美| 欧美日韩色一区| 亚洲福利精品视频| 日韩中文影院| 色哟哟在线观看一区二区三区| 日韩av高清在线看片| 污视频在线看网站| 一区二区三区精品视频| 伊人再见免费在线观看高清版| 午夜激情视频在线观看| 国产精品毛片久久久久久| 午夜精品视频在线观看一区二区| 日韩电影免费| 久久久www成人免费毛片麻豆| 久久久久久九九九九| 丝袜视频国产在线播放| 91小视频免费观看| 欧美另类一区| av成人手机在线| 国产精品久久久久久久久快鸭 | 动漫视频在线一区| 精品少妇一区二区三区免费观看| aaa黄色大片| 国产另类在线| 亚洲精品一区中文字幕乱码| 欧美偷拍一区二区三区| 成人一区二区| 久久精品国产成人精品| 精品99久久久久成人网站免费| 欧美成人tv| 国产69精品久久久久9| 国产成人在线免费观看视频| 麻豆久久精品| 国产女人18毛片水18精品| 99国产精品久久久久99打野战| 国产精品一二三区| 精品国产免费一区二区三区 | 91麻豆国产福利精品| 欧美精品123| 99re在线视频| 亚洲精品国产精品乱码不99| 18禁网站免费无遮挡无码中文| 欧洲一区二区三区精品| 欧美巨大另类极品videosbest | www.亚洲精品| 日韩欧美三级电影| 中文字幕资源网在线观看| 亚洲高清不卡在线| 三上悠亚在线一区二区| 日韩一二三区| 亚洲天堂第二页| 极品颜值美女露脸啪啪| 老鸭窝亚洲一区二区三区| 成人伊人精品色xxxx视频| 午夜视频福利在线| 亚洲欧洲日韩av| 久久国产精品网| 欧美成人家庭影院| 亚洲精品91美女久久久久久久| 久久久精品成人| 国产一区二区三区四区三区四 | 中文字幕av久久爽| 国产乱子轮精品视频| 欧洲在线视频一区| 久久久123| 欧美精品色一区二区三区| 久久午夜夜伦鲁鲁片| 图片小说视频色综合| 8050国产精品久久久久久| 一区二区三区亚洲视频| ww亚洲ww在线观看国产| 狠狠干视频网站| 久久99国产精品二区高清软件| 亚洲成av人乱码色午夜| 亚洲熟女少妇一区二区| 新狼窝色av性久久久久久| 99r国产精品视频| √天堂资源地址在线官网| 欧美日韩一区二区在线| 91porn在线| 91精品啪在线观看国产81旧版 | 经典三级久久| 一区二区国产精品视频| 久久久久久久久久免费视频 | 可以直接看的无码av| 午夜精品免费| 成人午夜小视频| 91caoporn在线| 日本高清不卡aⅴ免费网站| 黄色污在线观看| 国一区二区在线观看| 亚洲bt欧美bt日本bt| 日本欧美在线视频免费观看| 欧美性一二三区| 熟女俱乐部一区二区视频在线| 亚洲毛片播放| 国产精品亚洲综合| 岛国片av在线| 精品999在线播放| 久久久久久久久久99| 国产精品中文字幕欧美| 国产成人精品免费看在线播放| 精品国产黄a∨片高清在线| 在线观看日韩视频| 国产精品sm调教免费专区| 久久精品亚洲麻豆av一区二区| 国产精品50p| 天堂在线精品| 日本最新高清不卡中文字幕| 你懂的在线观看视频网站| 一本久道久久综合中文字幕 | 国产亲伦免费视频播放| 国产精品久久久99| 国产性生活一级片| 欧美日韩午夜| 国产亚洲精品久久飘花| 午夜欧美激情| 中日韩美女免费视频网站在线观看| 91丨九色丨海角社区| 日本一区二区三区在线观看| 美女网站色免费| 国产精品久久久乱弄| 444亚洲人体| 538视频在线| 亚洲精品自拍偷拍| 最新黄色网址在线观看| 亚洲欧美综合网| www.四虎精品| 久久久蜜桃一区二区人| 夜夜爽99久久国产综合精品女不卡 | 在线成人激情| 俄罗斯精品一区二区三区| 国产99在线观看| 一区二区三区日韩在线| 精品二区在线观看| 黑人巨大精品欧美一区二区| 日本爱爱爱视频| 精品亚洲成a人| 国产日韩av网站| 欧美一区二区三| 国产精品欧美日韩| 欧美大片黄色| 在线播放精品一区二区三区| 国产高潮在线观看| 色综合久久综合| 91视频综合网| 久久久九九九九| 日本黄色www| 玖玖国产精品视频| 艳母动漫在线观看| 天堂成人娱乐在线视频免费播放网站 | 91另类视频| 久久免费视频在线| h网站视频在线观看| 精品国产免费人成在线观看| 中文字幕免费视频观看| 亚洲妇女屁股眼交7| 成人一级片免费看| 成人av在线观| 免费黄频在线观看| 日韩专区欧美专区| 男女视频网站在线观看| 亚洲情侣在线| 日韩色妇久久av| 欧美18免费视频| 91牛牛免费视频| 亚洲国产尤物| 97超级碰碰人国产在线观看| 成人免费在线| 中文字幕在线看视频国产欧美在线看完整 | 亚洲电影免费观看高清完整版在线| 中文无码精品一区二区三区| 亚洲6080在线| 九九久久免费视频| 国产精品成人一区二区艾草| 巨胸大乳www视频免费观看| 国产精品99久久久久久久女警| 91淫黄看大片| 欧美专区18| 国产伦精品一区二区三区四区视频_| 无码一区二区三区视频| 天天人人精品| 国产亚洲电影| 欧美一区二区三区精美影视| 精品亚洲免a| 国产精品一区视频网站| 一区二区三区在线免费看| 91精品中国老女人| 亚洲国产伊人| 成人免费高清完整版在线观看| 欧美xnxx| 国产精品成av人在线视午夜片 | 国产伦精品一区二区三区精品视频| 欧美色网一区| 国产成人啪精品视频免费网| 超碰超碰人人人人精品| 欧美洲成人男女午夜视频| 精精国产xxxx视频在线播放| 国语自产精品视频在免费| 丰满的护士2在线观看高清| 久久99青青精品免费观看| 日韩123区| 久久久久久久久久久亚洲| 欧美78videosex性欧美| 久久久久久久999| 91精品国产黑色瑜伽裤| 午夜精品国产精品大乳美女| 成人bbav| 欧美一级视频一区二区| 91精品产国品一二三产区| 国产va免费精品高清在线| 日本欧美日韩| 国产精品永久免费视频| 爱情电影网av一区二区| 97人人模人人爽人人少妇| 77成人影视| 精品久久久久亚洲| 国产真实有声精品录音| 亚洲最新在线| 欧美婷婷在线| 欧美日韩亚洲一| 蜜臀精品一区二区三区在线观看 | 这里精品视频免费| 大地资源网3页在线观看| 欧美极品第一页| 在线天堂资源www在线污| 国产精品第10页| 精品一区91| 久久99国产精品| 精品久久影院| 成人午夜免费剧场| 一区二区三区精品视频在线观看 | 精品在线视频观看| 欧美视频精品一区| 一级做a爰片久久毛片16| 日韩精品中文字幕在线不卡尤物| 手机看片福利永久| 一区二区三区视频免费在线观看| 影音先锋在线视频| 人体精品一二三区| 国产成人免费av一区二区午夜| 超碰97人人在线| 国产最新精品| youjizz.com在线观看| 日日嗨av一区二区三区四区| 在线观看中文av| 91社区在线播放| 五月天色婷婷丁香| 日韩欧美在线字幕| 成 人 黄 色 片 在线播放| 亚洲欧美一区二区三区久久| 日本电影在线观看| 国产精品久久久久秋霞鲁丝| 91麻豆精品激情在线观看最新 | 国产精品一区二区在线观看| 日韩www.| 无码人妻h动漫| 国产综合久久久久久鬼色| 亚洲综合自拍网| 一区二区三区在线视频观看| 日韩国产亚洲欧美| 亚洲精品短视频| 污污视频在线看| 国产三级精品网站| 国产成人手机高清在线观看网站| 免费cad大片在线观看| 日本欧美韩国一区三区| 香港三级日本三级| 亚洲欧美另类图片小说| 亚洲综合成人av| 精品在线观看国产| 国模雨婷捆绑高清在线| 成人黄色av网站| 精品美女久久| 黄色网页免费在线观看| 国产成人精品免费看| 69夜色精品国产69乱| 在线观看亚洲精品视频| 你懂的在线视频| 欧美孕妇与黑人孕交| 国产精品1luya在线播放| 四虎4hu永久免费入口| 国内精品国产三级国产a久久| 女人黄色一级片| 色综合久久中文字幕综合网| 少妇人妻精品一区二区三区| 欧美黑人性猛交| 亚洲不卡在线| av在线免费观看国产| 国产在线乱码一区二区三区| 美国黄色特级片| 欧美性生活一区| 91精品国产综合久久久久久豆腐| 青青草一区二区| 国产一区二区三区四区| 精品国产成人av在线免| 久久久久久影视| 久草视频在线免费| 中文字幕日韩精品在线观看| 99久久婷婷国产综合精品首页| 日韩av不卡播放| 美女网站色91| 黄色录像免费观看| 91精品午夜视频| 亚洲淫性视频| av免费观看久久| 最新成人av网站| 五月开心播播网| 欧美伊人久久大香线蕉综合69| 91精品大全| 91精品中文在线| 黄色av日韩| brazzers精品成人一区| 91九色02白丝porn| 一级日本在线| 91沈先生作品| 日韩视频一区二区三区在线播放免费观看| 欧美xxxxx少妇| 一本久道久久综合中文字幕 | 欧美日韩破处| 黄色一级二级三级| 亚洲欧洲美洲综合色网| 超碰人人人人人人| 欧美一级免费视频| 日韩在线不卡| 久久国产免费视频| 大桥未久av一区二区三区| 阿v免费在线观看| 91久久精品在线| 亚洲精品美女91| av免费播放网站| 精品黑人一区二区三区久久| 手机在线观看av网站| 亚洲国产精品久久久久婷婷老年 | 欧美性受极品xxxx喷水| 99福利在线| 欧美黑人xxxxx| 韩国av一区二区三区四区| 日本中文字幕免费观看| 亚洲日本中文字幕| 精品国产伦一区二区三区观看说明| 国产精品国产对白熟妇| 国产女人aaa级久久久级| 国产婷婷在线视频| 日本精品视频在线| 亚洲国产老妈| 国产精品无码久久久久久| 日韩一区二区三区免费看| 爱情电影社保片一区| 午夜久久久久久久久久久| 91一区二区在线观看| 国产精品免费无遮挡| 欧美一级高清免费播放| 中文在线日韩| 亚洲成人黄色av|