日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

乐优商城(14)–订单服务

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 乐优商城(14)–订单服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

樂優商城(14)–訂單服務

一、創建訂單微服務

1.1、創建訂單父module

1.2、創建leyou-order-interface

pom文件:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>leyou-order</artifactId><groupId>com.leyou.order</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>leyou-order-interface</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>javax.persistence</groupId><artifactId>persistence-api</artifactId><version>1.0</version></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.1.6.Final</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.leyou.auth</groupId><artifactId>leyou-auth-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies></project>

1.3、創建leyou-order-service

pom文件:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>leyou-order</artifactId><groupId>com.leyou.order</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>leyou-order-service</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mybatis啟動器 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><!-- 通用Mapper啟動器 --><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId></dependency><!-- mysql驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId></dependency><dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>0.0.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>com.leyou.common</groupId><artifactId>leyou-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.leyou.auth</groupId><artifactId>leyou-auth-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.leyou.order</groupId><artifactId>leyou-order-interface</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.leyou.item</groupId><artifactId>leyou-item-interface</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies></project>

application.yaml

server:port: 8089 spring:application:name: order-servicedatasource:url: jdbc:mysql://127.0.0.1:3306/leyou?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=trueusername: rootpassword: 123456hikari:max-lifetime: 28830000 # 一個連接的生命時長(毫秒),超時而且沒被使用則被釋放(retired),缺省:30分鐘,建議設置比數據庫超時時長少30秒,參考MySQL wait_timeout參數(show variables like '%timeout%';)maximum-pool-size: 9 # 連接池中允許的最大連接數。缺省值:10;推薦的公式:((core_count * 2) + effective_spindle_count)driver-class-name: com.mysql.jdbc.Driverrabbitmq:host: IP地址username: leyoupassword: leyouvirtual-host: /leyoutemplate:retry:enabled: trueinitial-interval: 10000msmax-interval: 3000000msmultiplier: 2exchange: leyou.item.exchangepublisher-confirm-type: correlatedredis:host: IP地址port: 8975cloud:nacos:discovery:server-addr: IP地址:8848username: nacospassword: nacos mybatis:type-aliases-package: com.leyou.order.pojomapper-locations: mapper/OrderMapper.xmlconfiguration:map-underscore-to-camel-case: true mapper:not-empty: falseidentity: mysql leyou:worker:workerId: 1datacenterId: 1jwt:pubKeyPath: F:\\leyou\\rsa\\rsa.pub # 公鑰地址cookieName: LY_TOKEN # cookie的名稱pay:appId: wx8397f8696b538317 mchId: 1473426802key: T6m9iK73b0kn9g5v426MKfHQH7X8rKwbconnectTimeoutMs: 5000readTimeoutMs: 10000

啟動類

@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class LeyouOrderApplication {public static void main(String[] args) {SpringApplication.run(LeyouOrderApplication.class,args);} }

導入配置

訂單號生成器,攔截器配置,支付配置,swagger配置

屬性讀取

攔截器

支付工具類

添加網關路由

二、實體類及Mapper

2.1、實體類

2.1.1、Order

@Table(name = "tb_order") public class Order {@Idprivate Long orderId;// id@NotNullprivate Long totalPay;// 總金額@NotNullprivate Long actualPay;// 實付金額@NotNullprivate Integer paymentType; // 支付類型,1、在線支付,2、貨到付款private String promotionIds; // 參與促銷活動的idprivate String postFee;// 郵費private Date createTime;// 創建時間private String shippingName;// 物流名稱private String shippingCode;// 物流單號private Long userId;// 用戶idprivate String buyerMessage;// 買家留言private String buyerNick;// 買家昵稱private Boolean buyerRate;// 買家是否已經評價private String receiver; // 收貨人全名private String receiverMobile; // 移動電話private String receiverState; // 省份private String receiverCity; // 城市private String receiverDistrict; // 區/縣private String receiverAddress; // 收貨地址,如:xx路xx號private String receiverZip; // 郵政編碼,如:310001private Integer invoiceType;// 發票類型,0無發票,1普通發票,2電子發票,3增值稅發票private Integer sourceType;// 訂單來源 1:app端,2:pc端,3:M端,4:微信端,5:手機qq端@Transientprivate List<OrderDetail> orderDetails; //訂單信息集合@Transientprivate Integer status; //訂單狀態//get和set }

2.1.2、OrderDetail

@Table(name = "tb_order_detail") public class OrderDetail {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private Long orderId;// 訂單idprivate Long skuId;// 商品idprivate Integer num;// 商品購買數量private String title;// 商品標題private Long price;// 商品單價private String ownSpec;// 商品規格數據private String image;// 圖片//get和set }

2.1.3、OrderStatus

@Table(name = "tb_order_status") public class OrderStatus {@Idprivate Long orderId;/*** 初始階段:1、未付款、未發貨;初始化所有數據* 付款階段:2、已付款、未發貨;更改付款時間* 發貨階段:3、已發貨,未確認;更改發貨時間、物流名稱、物流單號* 成功階段:4、已確認,未評價;更改交易結束時間* 關閉階段:5、關閉; 更改更新時間,交易關閉時間。* 評價階段:6、已評價*/private Integer status;private Date createTime;// 創建時間private Date paymentTime;// 付款時間private Date consignTime;// 發貨時間private Date endTime;// 交易結束時間private Date closeTime;// 交易關閉時間private Date commentTime;// 評價時間//get和set }

一個訂單對應好幾種狀態,通過表tb_order_status來記錄訂單所處的不同狀態;一個訂單有好多訂單項,即多個商品信息,這個用表tb_order_detail來記錄

2.2、Mapper

OrderMapper

/*** Order 的通用mapper*/ public interface OrderMapper extends Mapper<Order> { }

OrderDetailMapper

/*** OrderDetail 的通用mapper*/ public interface OrderDetailMapper extends Mapper<OrderDetail>, InsertListMapper<OrderDetail> { }

OrderStatus

/*** OrderStatus 的通用mapper*/ public interface OrderStatusMapper extends Mapper<OrderStatus> { }

在啟動類中添加mapper掃描:

三、訂單相關接口

3.1、創建訂單

3.1.1、Controller

  • 請求方式:POST
  • 請求路徑:/order
  • 請求參數:order對象(包含訂單、訂單詳情等數據的json對象。)
  • 返回結果:訂單編號
/*** 創建訂單* @param order 訂單對象* @return 訂單編號*/ @PostMapping public ResponseEntity<Long> createOrder(@RequestBody @Valid Order order){Long id = this.orderService.createOrder(order);return new ResponseEntity<>(id, HttpStatus.CREATED); }

3.1.2、Service

public interface OrderService {/*** 創建訂單* @param order 訂單對象* @return 訂單編號*/Long createOrder(Order order); }

實現類:

@Service public class OrderServiceImpl implements OrderService {@Autowiredprivate IdWorker idWorker;@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate OrderStatusMapper orderStatusMapper;@Autowiredprivate OrderDetailMapper orderDetailMapper;private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);@Transactional(rollbackFor = Exception.class)@Overridepublic Long createOrder(Order order) {//1.生成orderIdlong orderId = idWorker.nextId();//2.獲取登錄的用戶UserInfo userInfo = LoginInterceptor.getLoginUser();//3.初始化數據order.setBuyerNick(userInfo.getUsername());order.setBuyerRate(false);order.setCreateTime(new Date());order.setOrderId(orderId);order.setUserId(userInfo.getId());//4.保存數據this.orderMapper.insertSelective(order);//5.保存訂單狀態OrderStatus orderStatus = new OrderStatus();orderStatus.setOrderId(orderId);orderStatus.setCreateTime(order.getCreateTime());//初始狀態未未付款:1orderStatus.setStatus(1);//6.保存數據this.orderStatusMapper.insertSelective(orderStatus);//7.在訂單詳情中添加orderIdorder.getOrderDetails().forEach(orderDetail -> orderDetail.setOrderId(orderId));//8.保存訂單詳情,使用批量插入功能this.orderDetailMapper.insertList(order.getOrderDetails());//9.減庫存logger.debug("生成訂單,訂單編號:{},用戶id:{}", orderId, userInfo.getId());return orderId;} }

基本邏輯:

  • 生成訂單id
  • 獲取登錄用戶的信息
  • 初始化訂單數據:買家昵稱、是否評論、創建時間、訂單號、用戶id
  • 保存訂單數據
  • 初始化訂單狀態數據:訂單id、訂單創建時間、訂單狀態(初始狀態:1,未付款)
  • 保存訂單狀態數據
  • 為訂單詳情中的數據添加訂單號,因為一個訂單下有多個訂單項
  • 保存訂單詳情數據
  • 減庫存

3.2、訂單查詢

3.2.1、Controller

  • 請求方式:GET
  • 請求路徑:/order/{id}
  • 請求參數:id,訂單編號
  • 返回結果:Order,訂單的json對象
/*** 根據訂單id查詢訂單* @param id 訂單編號* @return 訂單對象*/ @GetMapping("/{id}") public ResponseEntity<Order> queryOrderById(@PathVariable("id") Long id){Order order = this.orderService.queryOrderById(id);if (order == null){return ResponseEntity.notFound().build();}return ResponseEntity.ok(order); }

3.2.2、Service

/*** 根據訂單id查詢訂單* @param id 訂單編號* @return 訂單對象*/ Order queryOrderById(Long id);

實現類:

/*** 根據訂單id查詢訂單** @param id 訂單編號* @return 訂單對象*/ @Override public Order queryOrderById(Long id) {//先查詢訂單Order order = this.orderMapper.selectByPrimaryKey(id);//再查詢訂單詳細信息OrderDetail orderDetail = new OrderDetail();orderDetail.setOrderId(id);List<OrderDetail> orderDetails = this.orderDetailMapper.select(orderDetail);if (CollectionUtils.isEmpty(orderDetails)) return null;//order對象填充訂單詳情order.setOrderDetails(orderDetails);// 查詢訂單狀態OrderStatus orderStatus = this.orderStatusMapper.selectByPrimaryKey(id);//order對象設置訂單狀態order.setStatus(orderStatus.getStatus());return order; }

基本邏輯:

  • 根據訂單號查詢訂單對象
  • 根據訂單號查詢訂單詳情
  • 根據訂單號查詢訂單狀態
  • 給已經查詢到的訂單對象填充訂單詳情
  • 給已經查詢到的訂單對象設置訂單狀態

3.3、分頁查詢用戶訂單

3.3.1、Controller

  • 請求方式:Get
  • 請求路徑:/order/list
  • 請求參數:
    • page:當前頁,Integer類型,默認為1
    • rows:每頁大小,Integer類型,默認為5
    • status:訂單狀態,String類型,默認查詢全部狀態訂單
  • 返回結果:PageResult 對象,包含下面屬性:
    • total:總條數
    • items:當前頁訂單數組
      • 訂單對象
/*** 分頁查詢當前已經登錄的用戶訂單* @param page 頁數* @param rows 每頁大小* @param status 訂單狀態* @return*/ @GetMapping("/list") public ResponseEntity<PageResult<Order>> queryOrderList(@RequestParam(value = "page",defaultValue = "1")Integer page,@RequestParam(value = "rows",defaultValue = "5")Integer rows,@RequestParam(value = "status",required = false)Integer status ){PageResult<Order> orders = this.orderService.queryOrderList(page,rows,status);if (null == orders){return new ResponseEntity<>(HttpStatus.NOT_FOUND);}return ResponseEntity.ok(orders); }

3.3.2、Service

/*** 分頁查詢當前已經登錄的用戶訂單* @param page 頁數* @param rows 每頁大小* @param status 訂單狀態* @return*/ PageResult<Order> queryOrderList(Integer page, Integer rows, Integer status);

實現類:

/*** 分頁查詢當前已經登錄的用戶訂單** @param page 頁數* @param rows 每頁大小* @param status 訂單狀態* @return*/ @Override public PageResult<Order> queryOrderList(Integer page, Integer rows, Integer status) {//訂單狀態查詢,需自定義sql//分頁條件try {PageHelper.startPage(page,rows);//獲取用戶idUserInfo userInfo = LoginInterceptor.getLoginUser();//查詢數據Page<Order> pageInfo = (Page<Order>)this.orderMapper.queryOrderList(userInfo.getId(), status);List<Order> orders = pageInfo.getResult();orders.forEach(order -> {Example example = new Example(OrderDetail.class);//查詢該訂單下的所有訂單項example.createCriteria().andEqualTo("orderId",order.getOrderId());//獲取訂單項的具體信息List<OrderDetail> orderDetails = this.orderDetailMapper.selectByExample(example);order.setOrderDetails(orderDetails);});return new PageResult<>(pageInfo.getTotal(),pageInfo.getPages(), orders);} catch (Exception e) {logger.error("查詢訂單出錯",e);return null;} }

基本邏輯:

  • 對結果進行分頁
  • 獲取登錄用戶
  • 根據用戶信息查詢訂單
  • 訂單詳情填充
  • 返回分頁結果

3.3.3、Mapper

訂單的分頁查詢需要根據訂單狀態來篩選,后期要分別對其進行展示,而訂單狀態是在單獨一個表中,要進行分頁查詢的話,只能是tb_order表和tb_order_status兩個表先進行連接,然后對其進行分頁查詢,查詢完畢后再填充訂單詳情。這里用mybatis的xml配置文件方式來進行查詢

對應的mapper.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.leyou.order.mapper.OrderMapper"><resultMap id="orderWithDetail" type="com.leyou.order.pojo.Order" autoMapping="true"><id column="order_id" property="orderId" /><collection property="orderDetails" javaType="List" ofType="com.leyou.order.pojo.OrderDetail" autoMapping="true"><id property="id" column="id" /></collection></resultMap><select id="queryOrderList" resultMap="orderWithDetail">select o.order_id,o.total_pay,o.actual_pay,o.create_time,os.status,od.sku_id,od.num,od.title,od.own_spec,od.price,od.imagefrom tb_order oleft join tb_order_status os on o.order_id = os.order_idleft join tb_order_detail od on o.order_id = od.order_idwhere o.user_id = #{userId}<if test="status != null and status != 0">and os.status = #{status}</if>order by o.create_time desc</select> </mapper>

OrderMapper

/*** 分頁查詢當前用戶訂單* @param userId* @param status* @return*/ List<Order> queryOrderList(@Param("userId")Long userId, @Param("status")Integer status);

3.4、更新訂單狀態

3.4.1、Controller

  • 請求參數:PUT
  • 請求路徑:/order/{id}/{status}
  • 請求參數:
    • id:訂單編號,String類型,不能為空
    • status:訂單狀態,不能為空
  • 返回結果:null
/*** 更新訂單狀態* @param id* @param status* @return*/ @PutMapping("/{id}/{status}") public ResponseEntity<Boolean> updateOrderStatus(@PathVariable("id") Long id,@PathVariable("status") Integer status){Boolean bool = this.orderService.updateOrderStatus(id,status);if (null == bool){//返回400return ResponseEntity.badRequest().build();}//返回204return ResponseEntity.noContent().build(); }

3.4.2、Service

/*** 更新訂單狀態* @param id* @param status* @return*/ Boolean updateOrderStatus(Long id, Integer status);

實現類:

/*** 更新訂單狀態** @param id* @param status* @return*/ @Override public Boolean updateOrderStatus(Long id, Integer status) {OrderStatus orderStatus = new OrderStatus();orderStatus.setOrderId(id);orderStatus.setStatus(status);//根據狀態的不同更新不同的字段switch (status){case 2:orderStatus.setPaymentTime(new Date());//2.付款時間break;case 3:orderStatus.setConsignTime(new Date());//3.發貨時間break;case 4:orderStatus.setEndTime(new Date());//4.確認收貨,訂單結束break;case 5:orderStatus.setCloseTime(new Date());//5.交易失敗,訂單關閉break;case 6:orderStatus.setCommentTime(new Date());//6.評價時間break;default:return null;}return this.orderStatusMapper.updateByPrimaryKeySelective(orderStatus) == 1; }

基本邏輯:

  • 根據用戶id和訂單狀態構造orderStatus對象
  • 根據status的不同判斷是哪一個狀態,然后修改對應的時間
  • 然后返回更新結果

3.5、生成微信支付鏈接

3.5.1、Controller

  • 請求方式:Get
  • 請求路徑:/order/url/{id}
  • 請求參數:id,訂單編號
  • 返回結果:String類型,生成的微信支付鏈接
/*** 根據訂單id生成支付鏈接* @param orderId* @return*/ @GetMapping("/url/{id}") public ResponseEntity<String> generateUrl(@PathVariable("id") Long orderId){//生成付款鏈接String payUrl = this.payHelper.createPayUrl(orderId);if (StringUtils.isBlank(payUrl)){return ResponseEntity.notFound().build();}return ResponseEntity.ok(payUrl); }

3.6、查詢付款狀態

3.6.1、Controller

  • 請求方式: Get
  • 請求路徑: /state/{id}
  • 請求參數: id,訂單編號
  • 返回結果:0, 未支付 1,支付成功 2,支付失敗(查詢失敗,或者訂單過期)
/*** 查詢付款狀態* @param orderId* @return 0, 狀態查詢失敗 1,支付成功 2,支付失敗*/ @GetMapping("/state/{id}") public ResponseEntity<Integer> queryPayState(@PathVariable("id") Long orderId){PayState payState = this.payHelper.queryOrder(orderId);return ResponseEntity.ok(payState.getValue()); }

四、Swagger-UI

4.1、什么是OpenAPI

隨著互聯網技術的發展,現在的網站架構基本都由原來的后端渲染,變成了:前端渲染、前后端分離的形態,而且前端技術和后端技術在各自的道路上越走越遠。 前端和后端的唯一聯系,變成了API接口;API文檔變成了前后端開發人員聯系的紐帶,變得越來越重要。

沒有API文檔工具之前,大家都是手寫API文檔的,在什么地方書寫的都有,而且API文檔沒有統一規范和格式,每個公司都不一樣。這無疑給開發帶來了災難。

OpenAPI規范(OpenAPI Specification 簡稱OAS)是Linux基金會的一個項目,試圖通過定義一種用來描述API格式或API定義的語言,來規范RESTful服務開發過程。目前V3.0版本的OpenAPI規范已經發布并開源在github上 。

官網:https://github.com/OAI/OpenAPI-Specification

4.2、什么是swagger?

OpenAPI是一個編寫API文檔的規范,然而如果手動去編寫OpenAPI規范的文檔,是非常麻煩的。而Swagger就是一個實現了OpenAPI規范的工具集。

官網:https://swagger.io/

看官方的說明:

Swagger包含的工具集:

  • Swagger編輯器: Swagger Editor允許您在瀏覽器中編輯YAML中的OpenAPI規范并實時預覽文檔。
  • Swagger UI: Swagger UI是HTML,Javascript和CSS資產的集合,可以從符合OAS標準的API動態生成漂亮的文檔。
  • **Swagger Codegen:**允許根據OpenAPI規范自動生成API客戶端庫(SDK生成),服務器存根和文檔。
  • **Swagger Parser:**用于解析來自Java的OpenAPI定義的獨立庫
  • **Swagger Core:**與Java相關的庫,用于創建,使用和使用OpenAPI定義
  • Swagger Inspector(免費): API測試工具,可讓您驗證您的API并從現有API生成OpenAPI定義
  • SwaggerHub(免費和商業): API設計和文檔,為使用OpenAPI的團隊構建。

4.3、快速入門

SpringBoot已經集成了Swagger,使用簡單注解即可生成swagger的API文檔。

引入依賴

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.8.0</version> </dependency> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.8.0</version> </dependency>

編寫配置

@Configuration @EnableSwagger2 public class SwaggerConfig {@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).host("localhost:8089").apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.leyou.order.controller")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("樂優商城訂單系統").description("樂優商城訂單系統接口文檔").version("1.0").build();} }

接口聲明

在controller的每個handler上添加接口說明注解:

@RestController @RequestMapping("/order") @Api("訂單服務接口") public class OrderController {@Autowiredprivate OrderService orderService;@Autowiredprivate PayHelper payHelper;/*** 創建訂單* @param order 訂單對象* @return 訂單編號*/@PostMapping@ApiOperation(value = "創建訂單的接口,返回訂單編號",notes = "創建訂單")@ApiImplicitParam(name = "order",required = true,value = "訂單的json對象,包含訂單條目和物流信息")@ApiResponses({@ApiResponse(code = 200,message = "購物請求已接受,但是庫存不足"),@ApiResponse(code = 201,message = "訂單成功創建")})public ResponseEntity<Long> createOrder(@RequestBody @Valid Order order){Long id = this.orderService.createOrder(order);return new ResponseEntity<>(id, HttpStatus.CREATED);}/*** 根據訂單id查詢訂單* @param id 訂單編號* @return 訂單對象*/@GetMapping("/{id}")@ApiOperation(value = "根據訂單編號查詢訂單,返回訂單對象",notes = "查詢訂單")@ApiImplicitParam(name = "id",required = true,value = "訂單的編號")@ApiResponses({@ApiResponse(code = 200,message = "訂單查詢成功"),@ApiResponse(code = 404,message = "訂單未找到")})public ResponseEntity<Order> queryOrderById(@PathVariable("id") Long id){Order order = this.orderService.queryOrderById(id);if (order == null){return ResponseEntity.notFound().build();}return ResponseEntity.ok(order);}/*** 分頁查詢當前已經登錄的用戶訂單* @param page 頁數* @param rows 每頁大小* @param status 訂單狀態* @return*/@GetMapping("/list")@ApiOperation(value = "分頁查詢當前用戶訂單,并且可以根據訂單狀態過濾",notes = "分頁查詢當前用戶訂單")@ApiImplicitParams({@ApiImplicitParam(name = "page", value = "當前頁", defaultValue = "1", type = "Integer"),@ApiImplicitParam(name = "rows", value = "每頁大小", defaultValue = "5", type = "Integer"),@ApiImplicitParam(name = "status", value = "訂單狀態:1未付款,2已付款未發貨,3已發貨未確認,4已確認未評價,5交易關閉,6交易成功,已評價", type = "Integer")})@ApiResponses({@ApiResponse(code = 200,message = "訂單的分頁結果"),@ApiResponse(code = 404,message = "沒有查詢到結果"),@ApiResponse(code = 500,message = "查詢失敗")})public ResponseEntity<PageResult<Order>> queryOrderList(@RequestParam(value = "page",defaultValue = "1")Integer page,@RequestParam(value = "rows",defaultValue = "5")Integer rows,@RequestParam(value = "status",required = false)Integer status){PageResult<Order> orders = this.orderService.queryOrderList(page,rows,status);if (null == orders){return new ResponseEntity<>(HttpStatus.NOT_FOUND);}return ResponseEntity.ok(orders);}/*** 更新訂單狀態* @param id* @param status* @return*/@PutMapping("/{id}/{status}")@ApiOperation(value = "根據訂單id更新訂單狀態",notes = "更新訂單狀態")@ApiImplicitParams({@ApiImplicitParam(name = "id",value = "訂單編號",required = true,type = "Long"),@ApiImplicitParam(name = "status",value = "訂單狀態:1未付款,2已付款未發貨,3已發貨未確認,4已確認未評價,5交易關閉,6交易成功,已評價",type = "Integer")})@ApiResponses({@ApiResponse(code = 204,message = "true:修改狀態成功;false:修改狀態失敗"),@ApiResponse(code = 400,message = "請求參數有誤"),@ApiResponse(code = 500,message = "查詢失敗")})public ResponseEntity<Boolean> updateOrderStatus(@PathVariable("id") Long id,@PathVariable("status") Integer status){Boolean bool = this.orderService.updateOrderStatus(id,status);if (null == bool){//返回400return ResponseEntity.badRequest().build();}//返回204return ResponseEntity.noContent().build();}/*** 根據訂單id生成支付鏈接* @param orderId* @return*/@GetMapping("/url/{id}")@ApiOperation(value = "根據訂單編號生成支付鏈接",notes = "生成付款鏈接")@ApiImplicitParam(name = "id",value = "訂單編號",type = "Long")@ApiResponses({@ApiResponse(code = 200,message = "成功生成支付鏈接"),@ApiResponse(code = 404,message = "生成支付鏈接失敗"),@ApiResponse(code = 500,message = "服務器異常")})public ResponseEntity<String> generateUrl(@PathVariable("id") Long orderId){//生成付款鏈接String payUrl = this.payHelper.createPayUrl(orderId);if (StringUtils.isBlank(payUrl)){return ResponseEntity.notFound().build();}return ResponseEntity.ok(payUrl);}/*** 查詢付款狀態* @param orderId* @return 0, 狀態查詢失敗 1,支付成功 2,支付失敗*/@GetMapping("/state/{id}")@ApiOperation(value = "根據訂單編號查詢掃碼支付付款狀態",notes = "查詢付款狀態")@ApiImplicitParam(name = "id",value = "訂單編號",type = "Long")@ApiResponses({@ApiResponse(code = 200,message = "0, 狀態查詢失敗 1,支付成功 2,支付失敗"),@ApiResponse(code = 500,message = "服務器異常")})public ResponseEntity<Integer> queryPayState(@PathVariable("id") Long orderId){PayState payState = this.payHelper.queryOrder(orderId);return ResponseEntity.ok(payState.getValue());} }

常用注解說明:

/**@Api:修飾整個類,描述Controller的作用@ApiOperation:描述一個類的一個方法,或者說一個接口@ApiParam:單個參數描述@ApiModel:用對象來接收參數@ApiProperty:用對象接收參數時,描述對象的一個字段@ApiResponse:HTTP響應其中1個描述@ApiResponses:HTTP響應整體描述@ApiIgnore:使用該注解忽略這個API@ApiError :發生錯誤返回的信息@ApiImplicitParam:一個請求參數@ApiImplicitParams:多個請求參數*/

4.4、啟動測試

4.4.1、錯誤解決

錯誤1

返回401,未授權。因為訂單服務配置了攔截器,來獲取用戶信息,所以會攔截所有訪問該端口的請求,當訪問swagger-ui時直接將請求發送到controller中,導致訪問失敗。

具體看攔截器配置:

這里是攔截了所有請求,這里將該路徑排除攔截即可:

再次訪問http://localhost:8089/swagger-ui.html,不會引發401錯誤了

注意:導致401錯誤還有可能有該注解:@EnableWebMvc

后期在處理Long類型數據以json形式返回時的問題,會配置一個轉換器,要用到這個注解。在進行接口測試時將其注釋掉。

錯誤2

打開瀏覽器查看,可以發現產生這個問題的原因是無法加載swagger的ui文件:

還是因為攔截器的問題,那么過濾掉即可:

錯誤三

打開瀏覽器控制臺查看,還存在一些資源有401錯誤,仔細觀察都是在請求webjars路徑下的資源,攔截器過濾即可:

總結

無法訪問swagger-ui最主要的原因是攔截器的問題:

@Override public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/swagger-ui.html").excludePathPatterns("/swagger-resources/**").excludePathPatterns("/webjars/**"); }

4.4.2、查看接口信息

點擊任意一個接口,即可看到詳細信。

4.5、測試接口

4.5.1、創建訂單接口

可以通過頁面看到接口信息:

  • 請求方式:POST
  • 請求路徑:/order
  • 請求參數:包含訂單、訂單詳情等數據的json對象。
  • 返回結果:訂單編號

點擊Try It Out來測試:

輸入數據:

{"totalPay": 236800,"postFee": 0,"paymentType": 2,"actualPay": 236800,"buyerMessage": null,"buyerNick": "huge","orderDetails": [{"skuId": 3893493,"num": 1,"title": "蘋果(Apple)iPhone 6 (A1586) 16GB 金色 移動聯通電信4G手機3","price": 236800,"ownSpec": "{\"機身顏色\":\"鉆雕藍\",\"內存\":\"4GB\",\"機身存儲\":\"64GB\"}","image": "http://image.leyou.com/images/9/4/1524297342728.jpg"}],"receiver": "銷戶","receiverMobile": "15800000000","receiverState": "上海","receiverCity": "上海","receiverDistrict": "浦東新簽","receiverAddress": "航頭鎮航頭路18號塞上3號樓","receiverZip": "210000","invoiceType": 0,"sourceType":2 }

然后點擊execute:

查看結果:

401 未授權,因為下訂單需要用戶登錄,要攜帶token

通過ApiPost登錄生成token

把token的值手動加入到瀏覽器的cookie中

再次執行

添加成功,響應訂單編號

查看數據庫:

有數據,但是數據不一致,出現了精度損失,后面解決

4.5.2、生成ID的方式

訂單id的特殊性

訂單數據非常龐大,將來一定會做分庫分表。那么這種情況下, 要保證id的唯一,就不能靠數據庫自增,而是自己來實現算法,生成唯一id。

雪花算法

這里的訂單id是通過一個工具類生成的:

而工具類所采用的生成id算法,是由Twitter公司開源的snowflake(雪花)算法。

簡單原理

雪花算法會生成一個64位的二進制數據,為一個Long型。(轉換成字符串后長度最多19) ,其基本結構:

第一位:為未使用

第二部分:41位為毫秒級時間(41位的長度可以使用69年)

第三部分:5位datacenterId和5位workerId(10位的長度最多支持部署1024個節點)

第四部分:最后12位是毫秒內的計數(12位的計數順序號支持每個節點每毫秒產生4096個ID序號)

snowflake生成的ID整體上按照時間自增排序,并且整個分布式系統內不會產生ID碰撞(由datacenter和workerId作區分),并且效率較高。經測試snowflake每秒能夠產生26萬個ID。

使用

需要機器id和序列號:

加載屬性:

@ConfigurationProperties(prefix = "leyou.worker") public class IdWorkerProperties {private long workerId;// 當前機器idprivate long datacenterId;// 序列號public long getWorkerId() {return workerId;}public void setWorkerId(long workerId) {this.workerId = workerId;}public long getDatacenterId() {return datacenterId;}public void setDatacenterId(long datacenterId) {this.datacenterId = datacenterId;} }

編寫配置類:

使用:

4.5.3、查詢訂單接口

接口說明:

  • 請求方式:GET
  • 請求路徑:/order/{id}
  • 請求參數:id,訂單編號
  • 返回結果:Order,訂單的json對象

輸入數據的訂單id,測試:

結果:

4.5.4、更新訂單狀態

  • 請求參數:PUT
  • 請求路徑:/order/{id}/{status}
  • 請求參數:
    • id:訂單編號,String類型,不能為空
    • status:訂單狀態,不能為空
  • 返回結果:null

測試:

結果

數據庫中也發生了改變:

4.5.5、分頁查詢訂單

接口說明:

  • 請求方式:Get
  • 請求路徑:/order/list
  • 請求參數:
    • page:當前頁,Integer類型,默認為1
    • rows:每頁大小,Integer類型,默認為5
    • status:訂單狀態,String類型,默認查詢全部狀態訂單
  • 返回結果:PageResult 對象,包含下面屬性:
    • total:總條數
    • items:當前頁訂單數組
      • 訂單對象

測試

這里status參數未填寫,默認查詢所有訂單

4.5.6、生成微信付款鏈接

接口說明:

  • 請求方式:Get
  • 請求路徑:/order/url/{id}
  • 請求參數:id,訂單編號
  • 返回結果:String類型,生成的微信支付鏈接

測試

結果

微信支付相關

PayHelper支付工具類,PayStatue支付狀態枚舉類

4.5.7、查詢支付狀態

接口說明:

  • 請求方式: Get
  • 請求路徑: /state/{id}
  • 請求參數: id,訂單編號
  • 返回結果:0, 未支付 1,支付成功 2,支付失敗(查詢失敗,或者訂單過期)

未付款查詢

結果

因為尚未付款,所以查詢返回0

已付款查詢

這里打開index.html,輸入生成的微信支付鏈接,會生成一個二維碼:

掃碼支付,然后再次查詢.

這里需要真實付款,就不演示了 0.0,略…

總結

以上是生活随笔為你收集整理的乐优商城(14)–订单服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日本公乱妇视频 | 亚洲精品裸体 | 色婷婷六月| 特级西西444www高清大视频 | 9色在线视频 | 国产亚洲精品女人久久久久久 | 中文字幕精品三区 | 亚洲开心色 | 国产探花 | 99精品视频在线观看免费 | 久久久精品电影 | 黄色在线观看污 | 婷婷视频在线观看 | 久久香蕉电影网 | 亚洲国内在线 | 国产精品美女久久久久久久久久久 | 欧洲精品视频一区二区 | 91看片在线观看 | 一区二区三区久久精品 | 丁香视频在线观看 | 在线观看亚洲电影 | 日韩精品中文字幕av | 亚洲理论在线观看电影 | 超碰av在线| 久久精品这里精品 | 国产四虎影院 | 亚洲黄色免费观看 | 免费男女羞羞的视频网站中文字幕 | 毛片基地黄久久久久久天堂 | 三级午夜片 | 蜜臀av性久久久久av蜜臀三区 | 精品成人免费 | 在线视频手机国产 | 久久爱综合 | 免费视频资源 | 日韩欧美国产精品 | 美女免费黄网站 | 婷婷av网站 | 日韩夜夜爽 | 成人资源网| 免费看黄在线观看 | 香蕉视频在线免费 | 亚洲成人二区 | 国产婷婷在线观看 | 久久精品www人人爽人人 | 久久综合偷偷噜噜噜色 | 亚洲一区尤物 | 99视频国产精品免费观看 | 日韩欧美一区二区三区在线观看 | 中文字幕中文字幕在线中文字幕三区 | 99精品国产视频 | 91精品久久久久久综合五月天 | 国产精品毛片一区视频播 | 丁香视频五月 | 天天摸日日摸人人看 | 亚洲成人资源 | 99精品国产亚洲 | 亚洲电影成人 | 91精品国自产在线偷拍蜜桃 | 国产精品久久婷婷六月丁香 | 午夜精品一二区 | 久久亚洲视频 | 日韩黄色免费电影 | 久草网站在线 | av大片免费| 91福利区一区二区三区 | 一级黄色免费 | 日韩视频区| 成人久久18免费网站麻豆 | 日韩黄色一级电影 | 久久伦理电影 | 狠狠色狠狠色终合网 | 欧美孕妇与黑人孕交 | 国产精品初高中精品久久 | 国产精品久久久免费 | 黄色大全免费观看 | 成人毛片一区 | 97**国产露脸精品国产 | 97成人超碰 | 91传媒在线看 | 中文字幕资源在线 | 最新免费中文字幕 | 在线国产91 | 国产精品资源 | 国内99视频| 久草影视在线 | 高清av免费一区中文字幕 | 日日操天天操夜夜操 | 国产福利免费在线观看 | 国产91国语对白在线 | 成人免费影院 | 91av九色 | 国产精品国产三级国产 | av官网| 国产在线 一区二区三区 | 91亚色免费视频 | 久久最新网址 | 丁香在线视频 | 91理论片午午伦夜理片久久 | 精品女同一区二区三区在线观看 | av资源在线看 | 免费在线观看成人 | 波多野结衣视频网址 | 日韩黄色免费看 | 亚洲综合在线发布 | 亚洲国产精品久久 | 中文字幕精品一区二区精品 | 在线免费观看麻豆视频 | 日本在线观看一区二区 | 日韩在线免费高清视频 | 成人av在线网 | 六月色播| 国产精品手机在线观看 | 国产成人61精品免费看片 | 韩国视频一区二区三区 | 国产精品com | 91视频免费视频 | 91网在线 | 91精品在线免费观看 | 色综合色综合色综合 | 91精品国产91久久久久 | 亚洲国产成人久久 | 久久久久观看 | 日韩午夜三级 | 在线免费观看视频 | 97香蕉超级碰碰久久免费软件 | 91久久电影| 九九综合久久 | 国内偷拍精品视频 | 夜夜夜草 | 国产经典三级 | av一级片网站 | 国产在线黄 | 亚洲国内在线 | 久久亚洲在线 | 免费高清在线观看电视网站 | 成人久久久久久久久 | 亚洲国产av精品毛片鲁大师 | 亚洲视频每日更新 | 久久免费视频99 | a爱爱视频| 国产黄色片免费观看 | 婷婷网址| 国产区在线| 亚洲国产资源 | 91成人天堂久久成人 | 国产中文字幕网 | 在线 国产 亚洲 欧美 | 亚洲日本国产精品 | 少妇高潮流白浆在线观看 | 天堂va在线观看 | 丁香五婷 | 国产免费黄视频在线观看 | 亚洲爽爽网 | 成年一级片 | 国产精品99久久久精品 | 天天艹天天操 | 天天玩天天干天天操 | 精品国产乱码久久久久久浪潮 | 伊人天天狠天天添日日拍 | av成人亚洲 | 成人资源在线 | 日韩伦理片hd | 亚洲高清视频在线播放 | 亚洲日韩中文字幕 | 色噜噜在线观看 | 天天干天天弄 | 干亚洲少妇 | 中文字幕亚洲欧美日韩2019 | 97超碰国产在线 | 天天弄天天干 | 亚洲视频免费在线观看 | 久久xx视频 | 日日夜夜免费精品 | 91视频国产高清 | 亚洲人久久 | 久久精品毛片 | 国产麻豆视频免费观看 | 免费精品久久久 | 国产在线观看免 | av五月婷婷 | 成人免费观看视频网站 | 亚洲精品99久久久久久 | 日韩免费电影一区二区三区 | 日韩成年视频 | 成年人免费av | 精品国产一区二区三区蜜臀 | 国产精品久久久久一区 | 西西4444www大胆视频 | 最近在线中文字幕 | 亚洲色图激情文学 | 最新av在线网址 | 免费黄色小网站 | 9在线观看免费高清完整版 玖玖爱免费视频 | 亚洲视频999 | 日本韩国精品一区二区在线观看 | 美女网站免费福利视频 | 91av网址 | 日韩和的一区二在线 | 又色又爽又黄高潮的免费视频 | 亚洲黄色免费在线看 | 久草在线观看 | 狠狠色狠狠色综合系列 | 在线成人免费电影 | 波多野结衣电影久久 | 日本在线观看中文字幕无线观看 | 婷婷www| 在线观看免费观看在线91 | 麻豆视频入口 | 极品嫩模被强到高潮呻吟91 | 天天天色综合a | 国产一区在线免费 | 麻豆精品视频在线观看免费 | 国产一卡在线 | 最新av在线播放 | 欧美日韩在线免费观看视频 | 国产99久久久国产精品成人免费 | 激情丁香 | 欧美在线资源 | 久久久久久久久久久久久久av | 一区二区三区三区在线 | 亚洲视频 中文字幕 | 色综合五月 | 久久av免费观看 | 日韩乱色精品一区二区 | www欧美日韩 | 日夜夜精品视频 | 成人a在线| 久久久免费电影 | 久久不卡免费视频 | 国产丝袜高跟 | 久久黄视频 | 久久久久亚洲精品男人的天堂 | 色综合网在线 | 天天天天天天天天操 | 国产中文自拍 | 国产欧美久久久精品影院 | 九九九热精品 | 免费看一级黄色 | 91视频首页 | 青青久草在线视频 | 国产精品午夜在线 | 亚洲免费激情 | 国产精品黄网站在线观看 | av在线精品 | 国产又黄又猛又粗 | 日本中文字幕电影在线免费观看 | 91精品视频在线看 | 在线观看色网站 | 好看的国产精品视频 | 国产99久久久欧美黑人 | 国产精品久久艹 | 丁香高清视频在线看看 | 在线观看中文字幕av | 亚洲精品日韩在线观看 | 一级黄色大片 | www.夜夜夜| 久久国产系列 | 亚洲丝袜中文 | 黄色成人av在线 | 久久手机免费视频 | 国产手机视频在线观看 | 色香蕉在线视频 | 免费精品在线观看 | 天天天色综合a | 国产亚洲情侣一区二区无 | 国产又粗又硬又爽视频 | 97精品国产97久久久久久粉红 | 亚洲精品免费观看视频 | 国产精品9999| 亚洲国产三级在线观看 | 国产精品99久久久久人中文网介绍 | 中国一级片视频 | 免费观看一级视频 | 亚洲成人精品在线 | 1000部国产精品成人观看 | 久久夜夜操 | 亚洲色图27p | 国产亚洲精品久久19p | 欧美激情一区不卡 | 成人黄色在线看 | 国产三级在线播放 | 九九九九九九精品任你躁 | 成人亚洲欧美 | 婷婷综合五月天 | 久草精品视频在线播放 | 中文字幕一区2区3区 | 毛片二区| 韩国av永久免费 | 黄色免费高清视频 | 天天操天天舔天天干 | 99日韩精品 | 国产精品免费看久久久8精臀av | 中文字幕在线观看1 | 国产精品自产拍在线观看蜜 | 黄色激情网址 | 日韩欧美一区二区三区视频 | 在线视频日韩精品 | 亚洲视频免费 | 欧美精品一区二区在线观看 | 色成人亚洲 | 精品一区av | 天堂av免费| 在线播放视频一区 | 在线a人片免费观看视频 | 在线观看的a站 | 亚洲h色精品 | 激情久久久 | 国产91成人| 日韩视频在线观看视频 | 国产精品视屏 | 日韩激情中文字幕 | 亚洲国产伊人 | 免费国产一区二区视频 | av免费电影在线观看 | 国产一级在线观看 | 国产一级电影 | 国产一线二线三线在线观看 | 黄色91在线 | 日韩电影在线一区二区 | 成人av在线影视 | 国产精品久久久久久久久久久杏吧 | 欧美日本一二三 | 亚洲精品乱码久久久久久按摩 | 在线观看国产永久免费视频 | 综合激情婷婷 | 欧洲视频一区 | 91av在线播放视频 | 国产精品久久久免费 | 91经典在线 | 日韩免费视频一区二区 | 久久久免费观看 | 国产成人精品av久久 | 欧美久久久久久久久久久久 | 在线蜜桃视频 | 中文字幕在线观看不卡 | 中文字幕在线免费看 | 337p日本大胆噜噜噜噜 | 天天射天天添 | 国产黄色片久久 | 一区二区三区日韩精品 | 国产精品久免费的黄网站 | 亚洲国内精品在线 | 99久久99热这里只有精品 | 久久理论电影 | 狠狠色狠狠色综合系列 | 国产黄在线免费观看 | 福利一区在线 | 国产高清专区 | 99视频在线 | 久久久久亚洲天堂 | 最新一区二区三区 | 亚洲精品国产免费 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 日韩色一区二区三区 | 久久高清免费视频 | 狠狠操操操 | 欧美三级高清 | 18久久久久 | 激情片av | 国产一区二区精品久久 | 成人av日韩| 国产视频在线观看一区二区 | 97精品国自产拍在线观看 | 国产精品久久久久久五月尺 | 少妇精69xxtheporn| 日日操天天操夜夜操 | 99精品黄色 | 99久久99久久精品国产片 | 香蕉视频久久 | 日本精品一区二区三区在线观看 | 免费国产在线精品 | 日韩精品第1页 | 日本精品久久久一区二区三区 | 久久精品美女视频 | 国产尤物一区二区三区 | 99久热精品 | 天天做天天爱天天综合网 | 精品国产1区2区 | 亚洲精品在线观看网站 | 亚洲 欧洲 国产 精品 | av看片网| 午夜精品久久久久久久久久 | 日韩 国产 | 亚洲人av免费网站 | 在线观看免费福利 | 国产aaa毛片 | 黄色免费看片网站 | 欧美激情精品一区 | 日韩欧美电影 | 69精品人人人人 | 亚洲午夜久久久久久久久电影网 | 精品美女在线视频 | 欧美一级裸体视频 | 亚洲国产成人久久综合 | 四虎国产精品免费观看视频优播 | 国产尤物一区二区三区 | 成人小视频在线观看免费 | 亚洲国产精品99久久久久久久久 | 中文字幕在线观看视频网站 | 天天干天天爽 | 九色最新网址 | 中文字幕在线观看一区二区 | 成人四虎 | 99久久精品网 | 亚洲国产字幕 | 韩日电影在线 | 国产精品 9999 | 欧美日韩高清一区二区三区 | 久草视频中文 | 日韩视频免费在线 | 在线视频 91 | 亚洲资源在线观看 | 成年人视频在线免费观看 | 精品久操 | 成人免费在线视频 | 欧美色噜噜噜 | 麻豆精品传媒视频 | 亚洲一区二区精品 | 久久久久女教师免费一区 | 亚洲国产三级 | 99久久久久久久 | 久久国产精品精品国产色婷婷 | 色综合久久久久综合99 | 久操操| 国产一区二区三区四区在线 | 久久观看最新视频 | 天天操操操操操操 | 国产国语在线 | 国产精品av免费观看 | 精品国产美女在线 | 久久午夜免费视频 | 国产精品黑丝在线观看 | 狠狠狠色| 黄色网址av | av中文天堂 | 在线观看黄污 | 国产成人一区二 | 丰满少妇在线观看资源站 | 在线免费国产视频 | 伊人久久国产精品 | 伊甸园av在线 | 毛片99| av一区二区在线观看中文字幕 | 狠狠狠狠狠狠狠 | 国产在线观看你懂得 | 国产成人精品一区二区三区福利 | 成人影视免费看 | 色综合久久久久久久久五月 | 日韩精品视频一二三 | 久草在线手机观看 | 久久成年人| 久久精品欧美 | 中文字幕91视频 | 国产一级特黄毛片在线毛片 | 人人澡人人爱 | 久久久久久久久久网 | 狠狠躁夜夜a产精品视频 | 99视频精品在线 | 嫩草av在线 | 日本成人免费在线观看 | 国产午夜免费视频 | 久久精品久久久久电影 | 亚洲久草在线 | 91高清免费观看 | 国产91成人在在线播放 | 99看视频在线观看 | 久久精品久久99精品久久 | 国产69久久久 | 国产免费观看久久 | 亚洲精品国产精品乱码在线观看 | 激情久久久久 | 看片一区二区三区 | 欧洲精品一区二区 | 国产精品1区2区 | 男女免费视频观看 | 一区二区影视 | 中文在线字幕免费观看 | 国产精品久久久久久久妇 | 久免费视频 | 五月婷婷激情综合 | 在线亚洲欧美日韩 | 国产在线色 | 中文字幕人成不卡一区 | 色噜噜狠狠色综合中国 | 成人毛片在线视频 | 久久久99精品免费观看app | 国产美女黄网站免费 | 久久手机免费观看 | 在线免费观看黄 | 欧美日韩一区二区在线观看 | 亚洲精品成人网 | 草在线| 黄色看片 | 日韩精品视频久久 | 国产精品原创视频 | 精品女同一区二区三区在线观看 | 欧美日韩在线观看一区 | 日韩一区正在播放 | 丁香网婷婷 | 国产亚洲精品女人久久久久久 | 国产一级片不卡 | 亚洲天堂精品视频在线观看 | 久草在线在线视频 | 久久久久久久久久久久电影 | 免费看片成人 | 亚洲婷婷综合色高清在线 | 午夜成人影视 | 久久综合桃花 | 国产色秀视频 | 色综合久久久久综合99 | 欧美久久久久久久久久久 | 免费碰碰 | 亚洲久在线 | 欧洲精品亚洲精品 | 亚洲精品网页 | 色吊丝在线永久观看最新版本 | 99国产精品 | 在线观看视频h | 欧美老少交 | 中文字幕免费高清av | 国产视频在线观看免费 | 黄色成人av | 久久精品网站免费观看 | 中文字幕在线视频一区二区三区 | 欧美久久久久久久久 | 国产99久久久国产精品成人免费 | 亚洲一二三久久 | 日韩av进入 | 99热.com | 成年人免费看片 | 99久久国产免费,99久久国产免费大片 | 国产手机视频在线观看 | 国产成人精品免高潮在线观看 | se婷婷 | 日韩视频一区二区三区 | 夜夜夜草 | 超碰在线成人 | 国产主播99 | 永久免费av在线播放 | 色欧美综合 | 国产日韩欧美网站 | 97视频在线免费播放 | 五月婷婷六月丁香 | 成人av在线观 | 欧美日韩国产色综合一二三四 | 午夜精品视频一区二区三区在线看 | 日日爽夜夜操 | 欧美日韩亚洲在线观看 | 国产在线精品一区二区三区 | 午夜少妇一区二区三区 | 欧美性黑人 | 久久精品视频观看 | 国产专区第一页 | 婷婷六月综合网 | 免费观看黄 | 一区二区三区高清不卡 | 天天操夜夜爱 | 国产精品k频道 | 99九九99九九九视频精品 | 日韩欧美精品一区二区三区经典 | 天天se天天cao天天干 | 国产123av| 亚洲综合欧美激情 | 中文字幕在线观看第一区 | 香蕉视频在线观看免费 | 久草在线手机视频 | 欧美国产日韩一区二区三区 | 日韩视频免费观看高清 | 亚洲免费婷婷 | 九九免费视频 | 欧美视屏一区二区 | 麻豆视频在线免费 | 日韩国产精品一区 | 欧美精品久久久久久 | 日韩欧美有码在线 | 国产美腿白丝袜足在线av | 成人欧美亚洲 | 久久久久免费电影 | 久草在线视频国产 | 亚洲日本va午夜在线影院 | 成人a在线 | 成年人黄色在线观看 | 在线导航av | 中文在线免费观看 | 天天干天天拍天天操天天拍 | 亚洲国产精品久久 | 精品美女在线视频 | 91精品久久久久久久久久久久久 | 亚洲精品久久久久中文字幕二区 | 亚洲性少妇性猛交wwww乱大交 | 久久国产精品视频观看 | 久久久久女人精品毛片 | 中文国产在线观看 | 99视 | 在线黄频 | 亚洲高清视频在线 | 久久综合久久综合久久 | 丁香综合网 | 亚洲黄色三级 | 国产精品麻豆99久久久久久 | 中文字幕在线视频精品 | 国产群p| 亚洲精品va | 97在线视频网站 | 国产最新在线视频 | 激情综合网天天干 | 国产精品免费在线播放 | 欧美另类亚洲 | 伊人五月婷| 视频 天天草 | 中文字幕在线观看播放 | 欧美精品免费一区二区 | 91亚洲网| 亚洲国产婷婷 | 久久久久9999亚洲精品 | 草久中文字幕 | 久久久久久久久久影院 | 又黄又爽又色无遮挡免费 | 日韩在线视频一区二区三区 | 国产专区一 | 国产丝袜| 天天操夜操视频 | 日韩电影在线观看一区二区 | 最新成人在线 | 久久精品成人 | 欧美最猛性xxxxx亚洲精品 | 日韩网站免费观看 | 亚洲精品xx| 欧美激精品 | 成人免费在线视频 | 99r精品视频在线观看 | 97成人在线观看视频 | 国产高清视频色在线www | 啪啪肉肉污av国网站 | 在线国产精品视频 | 在线精品一区二区 | 麻豆国产视频下载 | 热久在线| 日本精品一区二区三区在线观看 | 激情久久网 | 国产精品久久久久久久久搜平片 | 国产精品成人一区二区三区吃奶 | 91传媒91久久久 | 久久国产午夜精品理论片最新版本 | 国内精品久久久久久久久久久久 | 中文字幕在线观看一区二区 | 久久视频这里只有精品 | 国内精品视频在线 | 国产一区二区三区免费观看视频 | 天天插伊人 | 开心激情久久 | 黄色三级免费网址 | 久久久综合精品 | 97超碰人人爱 | 六月丁香在线观看 | 国产精品午夜8888 | 色就是色综合 | 欧美日韩视频一区二区 | 日韩国产精品久久久久久亚洲 | 亚洲综合丁香 | 中文字幕av在线免费 | 波多野结衣一区二区三区中文字幕 | 在线观看成人福利 | 91精品资源 | 久久国产高清视频 | 丁香资源影视免费观看 | 亚洲国产婷婷 | 日本女人的性生活视频 | 日韩电影一区二区在线观看 | 亚洲狠狠操 | 成人在线免费av | 久久久久久国产精品亚洲78 | 久久中文精品视频 | 久久伊人综合 | 精品久久久影院 | 亚洲日本va午夜在线影院 | 天天操网站 | 久久激情视频 久久 | 激情综合啪 | 久久都是精品 | 免费a网址| 在线亚洲欧美日韩 | av噜噜噜在线播放 | 亚洲精品视频免费在线 | 天天爱天天草 | 青青啪| 96精品视频 | 国内久久久久久 | 精品一区电影国产 | 99c视频在线| 精品久久电影 | 国产小视频在线播放 | 久久99国产一区二区三区 | 国产黄色电影 | 国产一二区在线观看 | 国产99久久久国产精品成人免费 | 摸bbb搡bbb搡bbbb | 婷婷在线播放 | 亚洲精品午夜视频 | 日韩一区二区三区免费视频 | 国产一区二区久久久 | 日韩a欧美| 亚洲美女精品区人人人人 | 国产精品国产毛片 | 亚洲热视频 | 亚洲电影久久 | 免费久久久久久 | 久久a级片 | 在线观看免费国产小视频 | 久久久久国产精品视频 | 亚洲精品午夜国产va久久成人 | 操一草 | 精品国产美女在线 | 国产探花在线看 | a视频在线观看免费 | 亚洲美女在线国产 | 九九九九九精品 | 视频 国产区 | 伊人色综合久久天天网 | 99久久精品免费看国产一区二区三区 | 欧美一二三区播放 | 国产精品午夜久久久久久99热 | 超碰97公开 | 在线免费色视频 | 中文字幕亚洲国产 | 国产一区二区在线播放 | 手机看片久久 | 夜夜躁狠狠躁日日躁视频黑人 | 欧美色综合天天久久综合精品 | 天天干夜夜操视频 | 午夜视频在线观看一区二区三区 | 中文字幕av专区 | 97成人在线免费视频 | 999久久久久| 91视频下载 | 天天爽夜夜操 | 最近的中文字幕大全免费版 | 欧洲不卡av | 最新免费中文字幕 | 500部大龄熟乱视频 欧美日本三级 | 9999亚洲 | 国产男女爽爽爽免费视频 | 国产精品永久免费观看 | 欧美日韩网站 | 久久视频在线观看免费 | 亚洲午夜精品一区二区三区电影院 | 欧美精品乱码久久久久 | 五月天亚洲激情 | 91成人免费在线视频 | 国产精品不卡在线播放 | 欧美狠狠操 | 国产日本亚洲高清 | 久久爱992xxoo | 日日麻批40分钟视频免费观看 | 草久在线观看 | 日韩一级成人av | 日本精品久久久一区二区三区 | 亚洲一区网 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 二区中文字幕 | 粉嫩高清一区二区三区 | 日韩大片在线 | 69久久久久久久 | 免费进去里的视频 | 国产黄a三级 | 欧美一级电影免费观看 | 久久精品福利视频 | 丁香花在线视频观看免费 | 亚洲天堂网站视频 | 96亚洲精品久久久蜜桃 | 久久久久婷 | 国产精品麻豆三级一区视频 | 国产视频日韩视频欧美视频 | 天天操天天干天天综合网 | 亚洲专区在线播放 | 色黄久久久久久 | 国产在线免费观看 | 91黄色影视 | 91av短视频 | 欧美综合在线视频 | 国产乱视频 | 亚洲国产三级在线观看 | 成年人免费在线观看 | 亚洲在线成人精品 | 天天操夜操视频 | 国产精品9区 | 久久精品电影院 | 欧美一区二区精美视频 | 毛片一级免费一级 | 美女久久久久久久 | 在线观看国产永久免费视频 | 香蕉视频网址 | 婷婷国产v亚洲v欧美久久 | 97超碰人人澡人人爱 | 欧美激情精品 | 日韩av不卡播放 | 国产中文欧美日韩在线 | 色狠狠一区二区 | 成人午夜影视 | 欧美亚洲成人免费 | 日韩影片在线观看 | 在线看岛国av | 国产剧情在线一区 | 日p视频在线观看 | 在线观看亚洲免费视频 | 久精品在线 | 亚洲天堂网在线播放 | 涩涩网站在线播放 | 久久久2o19精品 | 97免费视频在线 | 国产精品一区二区三区视频免费 | 久久免费成人 | 区一区二区三区中文字幕 | 亚洲电影第一页av | 亚洲精品1区2区3区 超碰成人网 | 欧美日韩高清在线观看 | 在线成人国产 | 久久看看 | 97人人爽 | 操久在线| 国产xxxx性hd极品 | 99精品在线播放 | 天天操天天插 | 有码中文在线 | 日韩影视精品 | 美女网站视频色 | 96久久欧美麻豆网站 | 免费网址你懂的 | 天堂网在线视频 | 热久久国产 | 欧美日韩一区二区三区不卡 | 久久草在线视频国产 | 超碰在线人人 | 国产精品嫩草影视久久久 | 国产精品美女久久久久久久 | 国产精品18久久久久久久久久久久 | 中文字幕在线观看第三页 | 中文字幕激情 | 国产色资源 | av资源在线观看 | 国产精品成人a免费观看 | 久久久久久久久黄色 | 91男人影院 | 日本激情视频中文字幕 | 99热精品久久 | 国产福利a | 国产成人在线看 | 久草在线观看视频免费 | 午夜av免费 | 国产无区一区二区三麻豆 | 国产一区二区日本 | 久久色在线播放 | 丁香影院在线 | 国产精品va在线 | 久久亚洲免费视频 | 二区三区精品 | 久久精品99 | 亚洲美女在线一区 | 六月激情婷婷 | 又黄又爽又无遮挡免费的网站 | 国产区欧美 | 国产视频一区二区在线 | 日韩午夜小视频 | 久精品视频在线 | 少妇按摩av| 91日韩免费 | 国产高清黄色 | 国产中文字幕一区 | 日韩在线视频二区 | 久久99婷婷 | 国内综合精品午夜久久资源 | 久久视频热 | 亚洲天堂网视频在线观看 | 欧美综合色 | 在线精品播放 | 久久精品美女 | 久久久久国产a免费观看rela | 欧美日韩中字 | 国产一级做a | 国产午夜剧场 | 国内小视频 | 美女网站在线看 | 丁香一区二区 | 国产黄色片免费看 | 国产伦精品一区二区三区四区视频 | 国产午夜激情视频 | 国内久久久 | 日日摸日日添日日躁av | 国产成人精品国内自产拍免费看 | 国产精品女同一区二区三区久久夜 | 日韩免费视频播放 | 婷婷日韩| 天天操婷婷 | 中文字幕在线观看亚洲 | 最新久久久 | 五月婷婷.com | 麻豆91精品91久久久 | 国产高清久久 | 蜜臀av性久久久久av蜜臀三区 | 五月婷婷中文字幕 | 97人人模人人爽人人喊中文字 | 国产一级特黄毛片在线毛片 | 亚洲码国产日韩欧美高潮在线播放 | 国产资源在线视频 | 国外av在线 | 国产精品综合在线 | 91一区啪爱嗯打偷拍欧美 | 国产一区在线免费观看视频 | 午夜av网站| 国产福利一区在线观看 | 玖玖视频在线 | 国产小视频在线观看 | 国产精品久久一区二区三区不卡 | 国产最新视频在线 | 日韩免费福利 | 成人中文字幕av | 久久免费黄色大片 | 国产免费一区二区三区网站免费 | av中文资源在线 | 丝袜网站在线观看 | 国产一级黄| 亚洲最大成人网4388xx | 91视频首页| 国产永久免费 | 国产又粗又长的视频 | 国产欧美综合在线观看 | 国产午夜不卡 | 五月天激情电影 | 久久夜色精品国产欧美乱 | aⅴ视频在线| 99视频久久 | 日韩精品中文字幕在线 | 在线观看深夜视频 | 国产一区二区精品久久 | 成人免费 在线播放 | 在线成人一区 | 国内丰满少妇猛烈精品播放 | 成人午夜剧场在线观看 | 中文字幕欧美日韩va免费视频 | 日本大尺码专区mv | 精品国产一区二区三区四 | 91av久久| 久久精品国产亚洲精品2020 | 国产欧美精品在线观看 | 99热九九这里只有精品10 | 亚洲天堂在线观看完整版 | 国产一在线精品一区在线观看 | 黄色av网站在线免费观看 | 国产精品久久亚洲 | 成 人 免费 黄 色 视频 | 亚洲一区 av | 欧美一级性生活片 | 亚洲国产美女久久久久 | 一区 二区电影免费在线观看 | 国产免费高清视频 | 永久免费毛片在线观看 | 日韩视频免费观看高清完整版在线 | 一区免费观看 | 午夜久久久精品 | 中文字幕视频一区 | 国产专区一 | 一级a毛片高清视频 | 日本三级久久久 | 色欧美成人精品a∨在线观看 | 天天色综合三 | 日韩电影一区二区在线观看 | 国产精品视频免费观看 | av片在线观看 | 国产精品一区免费在线观看 | 国产精品日韩高清 | 亚洲精品成人av在线 | 黄色三级在线看 | 四虎在线免费观看视频 | 五月开心婷婷 | 国产精品一区二区在线观看免费 | 久久一二三四 | 制服丝袜在线91 | 51久久成人国产精品麻豆 | 青草视频在线免费 | 日韩一级电影在线 | 中文字幕一区二区三区乱码在线 | 亚洲一片黄 | 国内精品久久久久久中文字幕 | 超碰在线中文字幕 | 中文字幕在线看视频国产中文版 | 国产精品久久久久久一区二区三区 | 夜夜视频资源 | 丝袜网站在线观看 | 国产xvideos免费视频播放 | 国产91精品久久久久久 | 免费看毛片网站 | 日韩综合在线观看 | 日韩在线视频网站 | 国产美女主播精品一区二区三区 | 国产精品淫片 | 成人性生交大片免费观看网站 | 日本精品中文字幕在线观看 |