久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Springboot-注解-操作日志的實現方式

瀏覽:2日期:2023-03-23 14:07:09

此組件解決的問題是:

「誰」在「什么時間」對「什么」做了「什么事」

本組件目前針對 Spring-boot 做了 Autoconfig,如果是 SpringMVC,也可自己在 xml 初始化 bean

使用方式

基本使用

maven依賴添加SDK依賴

<dependency> <groupId>io.github.mouzt</groupId> <artifactId>bizlog-sdk</artifactId> <version>1.0.1</version> </dependency>

SpringBoot入口打開開關,添加 @EnableLogRecord 注解

tenant是代表租戶的標識,一般一個服務或者一個業務下的多個服務都寫死一個 tenant 就可以

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)@EnableTransactionManagement@EnableLogRecord(tenant = 'com.mzt.test')public class Main { public static void main(String[] args) { SpringApplication.run(Main.class, args); }}日志埋點1. 普通的記錄日志

pefix:是拼接在 bizNo 上作為 log 的一個標識。避免 bizNo 都為整數 ID 的時候和其他的業務中的 ID 重復。比如訂單 ID、用戶 ID 等

bizNo:就是業務的 ID,比如訂單ID,我們查詢的時候可以根據 bizNo 查詢和它相關的操作日志

success:方法調用成功后把 success 記錄在日志的內容中

SpEL 表達式:其中用雙大括號包圍起來的(例如:{{#order.purchaseName}})#order.purchaseName 是 SpEL表達式。Spring中支持的它都支持的。比如調用靜態方法,三目表達式。SpEL 可以使用方法中的任何參數

@LogRecordAnnotation(success = '{{#order.purchaseName}}下了一個訂單,購買商品「{{#order.productName}}」,下單結果:{{#_ret}}', prefix = LogRecordType.ORDER, bizNo = '{{#order.orderNo}}') public boolean createOrder(Order order) { log.info('【創建訂單】orderNo={}', order.getOrderNo()); // db insert order return true; }

此時會打印操作日志 “張三下了一個訂單,購買商品「超值優惠紅燒肉套餐」,下單結果:true”

2. 期望記錄失敗的日志, 如果拋出異常則記錄fail的日志,沒有拋出記錄 success 的日志

@LogRecordAnnotation( fail = '創建訂單失敗,失敗原因:「{{#_errorMsg}}」', success = '{{#order.purchaseName}}下了一個訂單,購買商品「{{#order.productName}}」,下單結果:{{#_ret}}', prefix = LogRecordType.ORDER, bizNo = '{{#order.orderNo}}') public boolean createOrder(Order order) { log.info('【創建訂單】orderNo={}', order.getOrderNo()); // db insert order return true; }

其中的 #_errorMsg 是取的方法拋出異常后的異常的 errorMessage。

3. 日志支持種類

比如一個訂單的操作日志,有些操作日志是用戶自己操作的,有些操作是系統運營人員做了修改產生的操作日志,我們系統不希望把運營的操作日志暴露給用戶看到,

但是運營期望可以看到用戶的日志以及運營自己操作的日志,這些操作日志的bizNo都是訂單號,所以為了擴展添加了類型字段,主要是為了對日志做分類,查詢方便,支持更多的業務。

@LogRecordAnnotation( fail = '創建訂單失敗,失敗原因:「{{#_errorMsg}}」', category = 'MANAGER', success = '{{#order.purchaseName}}下了一個訂單,購買商品「{{#order.productName}}」,下單結果:{{#_ret}}', prefix = LogRecordType.ORDER, bizNo = '{{#order.orderNo}}') public boolean createOrder(Order order) { log.info('【創建訂單】orderNo={}', order.getOrderNo()); // db insert order return true; }4. 支持記錄操作的詳情或者額外信息

如果一個操作修改了很多字段,但是success的日志模版里面防止過長不能把修改詳情全部展示出來,這時候需要把修改的詳情保存到 detail 字段,

detail 是一個 String ,需要自己序列化。這里的 #order.toString() 是調用了 Order 的 toString() 方法。

如果保存 JSON,自己重寫一下 Order 的 toString() 方法就可以。

@LogRecordAnnotation( fail = '創建訂單失敗,失敗原因:「{{#_errorMsg}}」', category = 'MANAGER_VIEW', detail = '{{#order.toString()}}', success = '{{#order.purchaseName}}下了一個訂單,購買商品「{{#order.productName}}」,下單結果:{{#_ret}}', prefix = LogRecordType.ORDER, bizNo = '{{#order.orderNo}}') public boolean createOrder(Order order) { log.info('【創建訂單】orderNo={}', order.getOrderNo()); // db insert order return true; }5. 如何指定操作日志的操作人是什么? 框架提供了兩種方法

第一種:手工在LogRecord的注解上指定。這種需要方法參數上有operator

@LogRecordAnnotation( fail = '創建訂單失敗,失敗原因:「{{#_errorMsg}}」', category = 'MANAGER_VIEW', detail = '{{#order.toString()}}', operator = '{{#currentUser}}', success = '{{#order.purchaseName}}下了一個訂單,購買商品「{{#order.productName}}」,下單結果:{{#_ret}}', prefix = LogRecordType.ORDER, bizNo = '{{#order.orderNo}}') public boolean createOrder(Order order, String currentUser) { log.info('【創建訂單】orderNo={}', order.getOrderNo()); // db insert order return true; }

這種方法手工指定,需要方法參數上有 operator 參數,或者通過 SpEL 調用靜態方法獲取當前用戶。

第二種: 通過默認實現類來自動的獲取操作人,由于在大部分web應用中當前的用戶都是保存在一個線程上下文中的,所以每個注解都加一個operator獲取操作人顯得有些重復勞動,所以提供了一個擴展接口來獲取操作人

框架提供了一個擴展接口,使用框架的業務可以 implements 這個接口自己實現獲取當前用戶的邏輯,

對于使用 Springboot 的只需要實現 IOperatorGetService 接口,然后把這個 Service 作為一個單例放到 Spring 的上下文中。使用 Spring Mvc 的就需要自己手工裝配這些 bean 了。

@Configurationpublic class LogRecordConfiguration { @Bean public IOperatorGetService operatorGetService() { return () -> Optional.of(OrgUserUtils.getCurrentUser()) .map(a -> new OperatorDO(a.getMisId())) .orElseThrow(() -> new IllegalArgumentException('user is null')); }}//也可以這么搞:@Servicepublic class DefaultOperatorGetServiceImpl implements IOperatorGetService { @Override public OperatorDO getUser() { OperatorDO operatorDO = new OperatorDO(); operatorDO.setOperatorId('SYSTEM'); return operatorDO; }}6. 日志文案調整

對于更新等方法,方法的參數上大部分都是訂單ID、或者產品ID等,

比如下面的例子:日志記錄的success內容是:“更新了訂單{{#orderId}},更新內容為…”,這種對于運營或者產品來說難以理解,所以引入了自定義函數的功能。

使用方法是在原來的變量的兩個大括號之間加一個函數名稱 例如 “{ORDER{#orderId}}” 其中 ORDER 是一個函數名稱。只有一個函數名稱是不夠的,需要添加這個函數的定義和實現。可以看下面例子

自定義的函數需要實現框架里面的IParseFunction的接口,需要實現兩個方法:

functionName() 方法就返回注解上面的函數名;

apply()函數參數是 '{ORDER{#orderId}}'中SpEL解析的#orderId的值,這里是一個數字1223110,接下來只需要在實現的類中把 ID 轉換為可讀懂的字符串就可以了,

一般為了方便排查問題需要把名稱和ID都展示出來,例如:'訂單名稱(ID)'的形式。

這里有個問題:加了自定義函數后,框架怎么能調用到呢?

答:對于Spring boot應用很簡單,只需要把它暴露在Spring的上下文中就可以了,可以加上Spring的 @Component 或者 @Service 很方便😄。Spring mvc 應用需要自己裝配 Bean。

// 沒有使用自定義函數 @LogRecordAnnotation(success = '更新了訂單{{#orderId}},更新內容為....', prefix = LogRecordType.ORDER, bizNo = '{{#order.orderNo}}', detail = '{{#order.toString()}}') public boolean update(Long orderId, Order order) { return false; } //使用了自定義函數,主要是在 {{#orderId}} 的大括號中間加了 functionName @LogRecordAnnotation(success = '更新了訂單ORDER{#orderId}},更新內容為...', prefix = LogRecordType.ORDER, bizNo = '{{#order.orderNo}}', detail = '{{#order.toString()}}') public boolean update(Long orderId, Order order) { return false; } // 還需要加上函數的實現 @Component public class OrderParseFunction implements IParseFunction { @Resource @Lazy //為了避免類加載順序的問題 最好為Lazy,沒有問題也可以不加 private OrderQueryService orderQueryService; @Override public String functionName() { // 函數名稱為 ORDER return 'ORDER'; } @Override //這里的 value 可以吧 Order 的JSON對象的傳遞過來,然后反解析拼接一個定制的操作日志內容 public String apply(String value) { if(StringUtils.isEmpty(value)){ return value; } Order order = orderQueryService.queryOrder(Long.parseLong(value)); //把訂單產品名稱加上便于理解,加上 ID 便于查問題 return order.getProductName().concat('(').concat(value).concat(')'); } }7. 日志文案調整 使用 SpEL 三目表達式

@LogRecordAnnotation(prefix = LogRecordTypeConstant.CUSTOM_ATTRIBUTE, bizNo = '{{#businessLineId}}', success = '{{#disable ? ’停用’ : ’啟用’}}了自定義屬性{ATTRIBUTE{#attributeId}}') public CustomAttributeVO disableAttribute(Long businessLineId, Long attributeId, boolean disable) { return xxx; }框架的擴展點

重寫OperatorGetServiceImpl通過上下文獲取用戶的擴展,例子如下

@Servicepublic class DefaultOperatorGetServiceImpl implements IOperatorGetService { @Override public Operator getUser() { return Optional.ofNullable(UserUtils.getUser()) .map(a -> new Operator(a.getName(), a.getLogin())) .orElseThrow(()->new IllegalArgumentException('user is null')); }}

ILogRecordService 保存/查詢日志的例子,使用者可以根據數據量保存到合適的存儲介質上,比如保存在數據庫/或者ES。自己實現保存和刪除就可以了

也可以只實現查詢的接口,畢竟已經保存在業務的存儲上了,查詢業務可以自己實現,不走 ILogRecordService 這個接口,畢竟產品經理會提一些千奇百怪的查詢需求。

@Servicepublic class DbLogRecordServiceImpl implements ILogRecordService { @Resource private LogRecordMapper logRecordMapper; @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public void record(LogRecord logRecord) { log.info('【logRecord】log={}', logRecord); LogRecordPO logRecordPO = LogRecordPO.toPo(logRecord); logRecordMapper.insert(logRecordPO); } @Override public List<LogRecord> queryLog(String bizKey, Collection<String> types) { return Lists.newArrayList(); } @Override public PageDO<LogRecord> queryLogByBizNo(String bizNo, Collection<String> types, PageRequestDO pageRequestDO) { return logRecordMapper.selectByBizNoAndCategory(bizNo, types, pageRequestDO); }}

IParseFunction 自定義轉換函數的接口,可以實現IParseFunction 實現對LogRecord注解中使用的函數擴展

例子:

@Componentpublic class UserParseFunction implements IParseFunction { private final Splitter splitter = Splitter.on(',').trimResults(); @Resource @Lazy private UserQueryService userQueryService; @Override public String functionName() { return 'USER'; } @Override // 11,12 返回 11(小明),12(張三) public String apply(String value) { if (StringUtils.isEmpty(value)) { return value; } List<String> userIds = Lists.newArrayList(splitter.split(value)); List<User> misDOList = userQueryService.getUserList(userIds); Map<String, User> userMap = StreamUtil.extractMap(misDOList, User::getId); StringBuilder stringBuilder = new StringBuilder(); for (String userId : userIds) { stringBuilder.append(userId); if (userMap.get(userId) != null) { stringBuilder.append('(').append(userMap.get(userId).getUsername()).append(')'); } stringBuilder.append(','); } return stringBuilder.toString().replaceAll(',$', ''); }}變量相關

LogRecordAnnotation 可以使用的變量出了參數也可以使用返回值#_ret變量,以及異常的錯誤信息#_errorMsg,也可以通過SpEL的 T 方式調用靜態方法噢

待擴展

實現一個 Log的 Context,可以解決方法參數中沒有的變量但是想使用的問題,初步想法是可以通過在方法中 add 變量的形式實現,很快就可以實現了 😄

注意點:

整體日志攔截是在方法執行之后記錄的,所以對于方法內部修改了方法參數之后,LogRecordAnnotation 的注解上的 SpEL 對變量的取值是修改后的值哦~

源碼

https://github.com/mouzt/mzt-biz-log

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關文章:
主站蜘蛛池模板: 国产激情偷乱视频一区二区三区 | 国产二区在线播放 | 爱爱视频网站 | 国产精品毛片一区二区在线看 | 91久久夜色精品国产网站 | 日本最新免费二区 | a免费观看 | 国产精品国产精品国产专区不卡 | 一区免费看 | 欧美xxxx在线 | 欧美一区二区在线视频 | 人人玩人人添人人澡97 | 美女一级毛片 | 色视频免费在线观看 | 国产一区二区在线视频 | 国产欧美精品一区二区色综合朱莉 | 日韩国产 | 中文成人在线 | 日韩中文一区二区 | 黄色一级片免费播放 | 久久都是精品 | 久久久久久婷婷 | 日韩中文字幕在线播放 | 国产成人精品一区二区 | 日韩三级 | 欧美精品在线免费观看 | 日本一级毛片免费看 | av一区二区三区 | 特级黄一级播放 | 精品国产精品 | 欧美一级欧美三级在线观看 | 国产情品 | 亚洲午夜精品在线观看 | 7799精品视频 | 欧美成亚洲 | 天天噜天天干 | 成年人免费看片 | av毛片在线免费看 | 国产精品精品视频 | 精品国产乱码久久久久久久软件 | 国产成人毛片 | 欧美日韩久久精品 | 狠狠操天天操 | 天天综合网7799精品 | 久久国内 | 青娱乐一区 | 日本亚洲精品成人欧美一区 | 国产黄色大全 | 色婷婷网 | 伊人网站| 亚洲一区中文字幕在线观看 | 综合伊人 | 久久久一二三 | 亚洲国产久 | 久久成人一区二区 | 精品1区| 天天操天天摸天天干 | 国产精品久久久久久久久久久久冷 | 亚洲一区二区精品视频 | 久草免费在线视频 | 成人视屏在线观看 | 91午夜在线 | 亚洲人免费 | 国产日韩精品一区二区 | www.av在线 | 成人亚洲免费 | 久久成人综合网 | 黄色免费网站在线看 | 黑人粗黑大躁护士 | 91在线激情 | 久久久久一区二区 | 久久久91 | 久久99这里只有精品 | 欧美久久综合 | 国产精品久久久久久久娇妻 | 九色91 | 国产精品国产精品国产专区不片 | 亚洲三级视频 | 在线看欧美 | 国产精品1区2区3区 欧美 中文字幕 | 亚洲a在线播放 | 99久久久久 | 国产一区二区视频在线观看 | 最近免费中文字幕在线视频2 | 国产精品一区二区三区在线看 | 国产不卡视频 | 一级日韩电影 | 国产在线色| 免费久久网站 | 狠狠干av | 中文字幕一区二区三区乱码在线 | 玖玖视频在线 | 国产精品久久久久久久久免费 | 精品国产一区探花在线观看 | 久久9视频 | 成人一级片视频 | 一区免费视频 | 久久极品 | 午夜国产精品视频 | 国产精品国产a级 | 免费成人在线电影 | 色999国产 | 亚洲综合在线视频 | 天堂一区 | 久久婷婷视频 | 欧美国产高清 | 日本成人中文字幕 | 天天天天天天操 | 操人网 | 亚洲欧美精品久久 | 涩久久| 日韩欧美在线观看一区二区 | av在线免费看片 | 亚洲第一视频网站 | 日本亚洲欧美 | 亚洲高清视频一区二区 | 天堂av在线免费观看 | 97精品国产97久久久久久粉红 | 免费三级电影网站 | 日本久久精品视频 | 欧美日韩在线观看一区二区三区 | 日日干日日爽 | 日韩高清在线 | 久久视频免费 | 国产一区二区欧美 | av在线免费观看网站 | 亚洲精品视频网 | 81精品国产乱码久久久久久 | 婷婷久久五月 | 亚洲一区中文字幕 | 91国内外精品自在线播放 | 久久久蜜臀 | 精品视频一区二区三区四区 | 一区在线视频 | 久久精品国产精品 | 中文字幕一区二区三区四区不卡 | 成人激情视频在线观看 | 操视频网站 | 一区二区在线视频 | 伊人精品影院 | 蜜臀视频在线观看 | 99亚洲| 奇米av| 国产精品久久久久久久久久久免费看 | 国产精品一码二码三码在线 | 日韩欧美视频 | 成人免费观看视频 | 日本不卡高字幕在线2019 | 在线观看国产高清视频 | 日韩不卡av| 亚洲性视屏 | 免费在线精品视频 | 日本黄色一级片免费看 | 97精品国产| 国产精品无码久久久久 | 亚洲福利在线播放 | 久久国产精品亚洲 | av一区二区在线观看 | 国产福利一区二区 | 久久99精品久久久久久琪琪 | 国产精品一区二区av | 日日干,天天干 | 特级黄一级播放 | 国产aaa大片 | 亚洲精选一区二区 | 精品国产一区二区三区日日嗨 | 91男女视频 | 国产一区二区影院 | 久久精品国产亚卅av嘿嘿 | 日韩精品久久 | 免费日本视频 | 北条麻妃一区二区在线 | 精品免费国产一区二区三区 | 中文字幕精品一区久久久久 | 欧美日韩精品一区二区在线播放 | 91网站在线看 | 中文字幕av亚洲精品一部二部 | 欧美日韩精品一区二区在线播放 | 国产精品成人一区二区三区夜夜夜 | 香蕉视频一级片 | 国产精品久久久久久久久久久久午夜片 | 国产在线精品一区二区三区 | 久久99国产精品久久99大师 | 欧美日韩不卡合集视频 | 国产精品福利午夜在线观看 | 99久久免费精品国产男女性高好 | 亚洲欧美日韩另类精品一区二区三区 | 一区二区日韩在线观看 | 亚洲二区在线 | 日本精品免费 | 亚洲高清视频在线观看 | 久久综合精品视频 | 精品国产青草久久久久福利 | 欧美夜夜爽 | 亚洲av一级毛片 | 在线观看亚洲精品视频 | 99久久99热这里只有精品 | 久久久久国产精品一区二区三区 | 香蕉久久一区二区不卡无毒影院 | 欧美在线a | 99色资源 | 999久久久国产999久久久 | 嫩草影院永久入口 | 国产一区二区精品在线观看 | av一区在线观看 | 九九久久精品 | 玖玖在线精品 | 欧美日本一区 | 91麻豆精品国产91久久久更新资源速度超快 | 国产美女自拍视频 | 中文字幕国产日韩 | 日韩免费视频 | 综合久久国产九一剧情麻豆 | 夜夜精品视频 | 中文字幕国产日韩 | 亚洲国产成人精品女人久久久 | 国产精品无码久久久久 | 久久国产精品一区二区 | h亚洲视频| 国内精品视频在线观看 | 国产精品网站在线 | 精品人伦一区二区三区蜜桃视频 | 久久久久久综合 | 色黄网站 | 久久草草影视免费网 | 欧美在线视频网 | 国产大毛片| 一区在线视频观看 | 午夜免费观看网站 | 久久精品毛片 | 亚洲免费视频在线观看 | 精品欧美一区二区精品久久久 | 中文字幕1区| 免费av手机在线观看 | 99热热热 | 国产成人午夜精品影院游乐网 | 91香蕉视频 | 午夜在线观看免费 | 精品国产污网站污在线观看15 | www日韩 | 久久99精品久久久久久园产越南 | 99热新 | 久久亚洲国产 | 日韩在线观看精品 | 国产精品久久嫩一区二区免费 | 中文字幕精品一区久久久久 | 欧亚视频在线观看 | 欧美女优在线视频 | 欧美一级一区 | 欧美日韩精品一区 | 伊人春色网 | 四虎永久免费 | 日韩精品视频在线观看免费 | 日韩欧美国产网站 | 青青草av | 中文字幕国产一区 | 一区二区精品 | www.亚洲一区| 草草视频网站 | 91综合视频在线观看 | 久久精品欧美一区二区三区不卡 | 一区二区视频 | 久久精品国产亚洲 | 国产美女黄色片 | 国产片侵犯亲女视频播放 | 久在线视频 | 美女久久久 | 夜夜艹 | 美女视频一区二区三区 | 亚洲精品视频在线播放 | 国产精品久久影院 | 日日夜夜天天 | 久久天堂 | 91精品久久久久久久久久 | 成人福利在线观看 | 欧美自拍三区 | 色综合免费| 伊人逼逼| 久久久久久免费看 | 久久九九国产精品 | 中文字字幕一区二区三区四区五区 | 久久精品日产高清版的功能介绍 | 久久精美视频 | 国产精品天天干 | 欧美日本韩国一区二区三区 | 亚洲一区二区三区四区在线观看 | 国产成人午夜 | 蜜桃精品久久久久久久免费影院 | 国产一区二区三区在线免费观看 | 99国产精品99久久久久久 | 日韩午夜电影在线观看 | 性一级录像片片视频免费看 | 91精品国产综合久久福利软件 | julia中文字幕久久一区二区 | 国产精品毛片无码 | 国产成人jvid在线播放 | 午夜电影福利 | 日韩中文视频 | 亚洲欧美一区二区三区在线 | 国产精品永久免费自在线观看 | 一级女性全黄久久生活片免费 | 久久久天堂 | 国产一区二区影院 | 国产精品久久婷婷六月丁香 | 欧美一区二区三区在线观看视频 | jlzzjlzz亚洲日本少妇 | 国产精品毛片一区二区在线看 | 国产成人免费视频 | 国产一级片 | 91在线网址 | 欧美日韩一区二区三区在线观看 | 国产第一页在线播放 | 久久国产精品免费一区二区三区 | 日本久久精品一区 | 中文字幕亚洲欧美日韩在线不卡 | 亚洲精品网址 | 又黄又爽的网站 | 欧美日韩中文在线 | 久久99精品久久久久婷婷暖91 | 一二三四区视频在线观看 | 欧美成人午夜视频 | 日本不卡高字幕在线2019 | 久久午夜电影院 | 性欧美大战久久久久久久免费观看 | 成人国产精品久久 | 亚洲一区二区三区免费在线 | 黄色手机在线观看 | 狠狠干美女 | 久久精品中文字幕 | 在线免费观看日韩视频 | 一区二区精品在线 | 久久免费的视频 | 男女羞羞视频网站18 | 在线播放三级 | 欧美久热 | 先锋影音av资源站 | 欧美一级久久 | 一级毛片在线看aaaa | 国产精品毛片一区二区在线看 | 国产日韩精品一区二区 | 成人av福利 | 中文一区| 国产另类一区 | 欧美伦理电影一区二区 | 国产精品久久久久aaaa | 欧洲毛片 | 国产欧美综合一区二区三区 | 成人在线视频观看 | 国产婷婷色一区二区三区 | 亚洲视频在线看 | 91网在线观看 | 国产精品久久久久久久久久久久久 | 成人精品鲁一区一区二区 | 国产玖玖 | 日韩成人一区 | 狠狠久久综合 | se69色成人网wwwsex | 亚洲444kkkk在线观看最新 | 久久久精品国产 | 国产成人在线播放 | 国产1级片| 黄色三及毛片 | 国产精品福利在线观看 | 欧美激情视频一区二区三区 | 91久久久久 | 日韩在线免费 | 特黄特黄a级毛片免费专区 av网站免费在线观看 | 亚洲精品免费看 | 亚洲一区二区视频 | 夜夜艹| 中文字幕一区二区三区不卡 | 91看片网 | 欧美一区二区三区在线视频 | 影音先锋中文字幕一区 | 日韩成人一区 | 国产高清久久久 | 国产综合视频在线观看 | av国产精品| 99久久久久久 | 国产综合久久 | 一区二区三区在线观看免费 | 中文字幕在线视频第一页 | 91久久国产综合久久蜜月精品 | 亚洲综合无码一区二区 | 亚洲社区在线 | 黄篇网址 | 99久久婷婷国产精品综合 | 一级在线观看 | 中文字幕精品一区 | 成人高清在线观看 | 九九热这里都是精品 | 成人一级片视频 | 精品欧美一区二区精品久久久 | 97国产在线 | 欧美日韩中文字幕 | 中文字幕国产日韩 | 欧美精品第一页 | 久久久成人精品 | 亚洲成人一区二区三区 | 国产乱码一区二区三区在线观看 | 精品久久99 | 在线看免费观看日本 | 午夜在线电影 | 久久国产精品亚洲 | 中字一区 | 久久一日本道色综合久久 | 人人操日日干 | 国产一级黄色大片 | 免费毛片视频 | 九色在线播放 | 欧美日韩在线免费观看 | 成人区一区二区三区 | 91精品国产综合久久久久久蜜臀 | 激情久久久久 | 青青草视频在线免费观看 | 国产一区日韩在线 | 欧美日韩高清 | 色综合天天 | 麻豆成人在线 | 在线视频一区二区三区 | 黄a在线看 | 成人天堂资源www在线 | 国产成人精品久久二区二区91 | 精品乱码一区二区 | 国产精品久久久久久亚洲调教 | 极品久久 | 女人色网| 麻豆一区二区三区 | 亚洲精品视频在线免费播放 | 涩涩视频在线观看 | 99精品网站 | 亚洲精品一区二区三区精华液 | 国产精品成人在线观看 | 天堂网中文在线 | 国产午夜精品一区二区三区嫩草 | 能免费看的av | 国产中文字幕一区 | 夜夜草 | 九九免费在线观看 | 亚洲欧美一区二区三区在线 | 亚洲黄色一区二区三区 | 国产成人精品一区二区三区 | 国产欧美一区二区精品久久 | 人操人人 | 台湾av在线| 免费亚洲婷婷 | jizz在线播放| 免费的黄色网 | 91手机精品视频 | 9999国产精品欧美久久久久久 | 亚洲欧美高清 | 在线观看国产小视频 | 国产性网 | 国产欧美日韩在线观看 | 婷婷综合 | 天天操,夜夜操 | 欧美精品成人一区二区三区四区 | 久久亚洲精品视频 | 国产成人精品电影 | 美女视频黄a | 国产91网址 | 99精品国产高清一区二区麻豆 | 久久久久久久国产 | 亚洲在线观看免费视频 | 亚洲视频观看 | 欧美精品一区二区三区在线 | 九九热在线免费视频 | 精品日韩欧美一区二区三区在线播放 | 蜜臀网 | 成人精品 | 精品1区| 精品国产一区二区三区久久久蜜月 | 国产精品大片 | 五月婷婷在线观看视频 | 精品久久久久久久 | 黄色片网站在线看 | 日本三级在线视频 | 国产亚洲一区二区三区在线观看 | h免费在线 | 国产精品一区二区在线看 | 婷婷在线视频 | 青青久久北条麻妃 | 亚洲成人av | 国产一级一级特黄女人精品毛片 | 黄色在线免费观看 | 三级黄色片在线 | 欧美极品视频 | a久久| 国产视频观看 | 精品国产18久久久久久二百 | 久久精品网 | 国产区视频在线观看 | 97在线观看视频 | 欧美日韩在线一区二区三区 | 精品无码久久久久久国产 | 一道本一区| 黄网站免费在线观看 | 亚洲国产成人av好男人在线观看 | 精品久久久久久久久久久久久久 | 精品视频久久 | 欧美日韩一区二区电影 | 欧美精品日韩 | 精品久久久久久 | 亚洲一区二区在线免费观看 | av在线日韩 | 午夜精品亚洲日日做天天做 | 欧日韩不卡在线视频 | 欧美性久久 | 久草视频在线播放 | 99精品久久久 | 久久久日本 | 亚洲国产精品久久 | 日韩成人免费中文字幕 | 国产性一级片 | 欧美国产日韩在线 | 一级黄色短片 | 国产一区二区在线免费 | 色婷婷久久久swag精品 | 久久这里只有精品首页 | 日韩大尺度在线观看 | 久久久久久精 | 日韩一二三区在线观看 | 亚洲一区av | 欧美成人高清视频 | 91精品久久久久久久久 | 国产久| 国产二区三区 | 国产精品视频导航 | 国产高清在线精品一区二区三区 | 亚洲一区二区久久 | 97久久久国产精品 | 在线观看国产精品一区二区 | a黄视频| 欧美亚洲一| av免费观看网站 | 国产ts余喵喵和直男多体位 | 日韩视频一区二区三区四区 | √天堂在线 | 欧美一级特黄aaaaaaa色戒 | 视频在线一区二区 | 久久se精品一区精品二区 | 亚州精品视频 | 久久一视频 | 四季久久免费一区二区三区四区 | 欧美一级电影 | 九九久久精品视频 | 国产精品毛片无码 | 盗摄精品av一区二区三区 | 久久首页| 久久伊人免费视频 | 久久国产精品一区二区 | 国产不卡一区 | a毛片国产| 国产精品白浆 | 精品国产欧美一区二区三区不卡 | 四虎免费看黄 | 狠狠操电影| 黄色资源在线观看 | 交视频在线观看国产 | 国产精品毛片一区视频播 | 久久国产精品一区 | 国产精品一区二区不卡 | 国产成人精品一区二区三区四区 | 国产永久免费观看 | 精品国产乱码久久久久久久软件 | www国产免费| 99热少妇 | 久久青青 | 99精品欧美一区二区蜜桃免费 | 亚洲男人av | 在线观看国产www | 午夜私人福利 | 亚洲一区精品在线 | 一区二区三区久久 | 91精品在线观看入口 | 精品成人| 欧美日韩国产一区二区三区不卡 | 午夜精品久久久久久久男人的天堂 | 精品国产免费久久久久久尖叫 | 91中文字幕在线观看 | 色花av| 亚洲天堂一区二区 | 欧美日韩精品一区 | 一区二区三区视频在线播放 | 精品一二区 | 欧美激情在线观看 | 国产精品国产精品国产专区不片 | 99精品欧美一区二区三区 | 欧美日本亚洲 | 男女视频免费 | 日本免费黄色 | 亚洲免费国产视频 | 日韩免费视频 | 亚洲精品免费在线观看 | 91精品国产免费 | 成人一区二区三区久久精品嫩草 | 久久mm| 蜜桃av一区二区三区 | 一区免费观看 | 东北一级毛片 | 日韩午夜免费视频 | 国产福利视频 | 亚洲精品一区在线观看 | 国产午夜精品一区二区三区视频 | 成人国产免费视频 | 欧美视频三级 | 日韩精品一区二区三区在线观看 | 2018国产大陆天天弄 | 国产日韩欧美精品一区二区三区 | 不卡欧美| 国产精品毛片 | 美女视频一区二区三区 | 午夜激情电影在线 | 国产精品视频免费看 | 色综合免费 |