03购物车渲染

这篇博客详细介绍了在微服务架构下购物车的渲染过程,包括购物车渲染服务的搭建、feign调用、前端页面处理、商品数量变更、删除商品、订单服务对接OAuth认证、微服务间认证实现、动态获取当前登录人以及页面配置等关键步骤。通过这些步骤,实现了用户友好的购物车功能。

3.购物车渲染

在这里插入图片描述

如上图所示,用户每次将商品加入购物车,或者点击购物车列表的时候,先经过订单购物车后端渲染服务,再通过feign调用购物车订单微服务来实现购物车的操作,例如:加入购物车、购物车列表。

3.1购物车渲染服务搭建

在changgou_web中搭建订单购物车微服务工程 changgou_web_order ,该工程主要实现购物车和订单的渲染操作。
(1) pom.xml依赖

<dependencies>
	<dependency>
		<groupId>com.changgou</groupId>
		<artifactId>changgou_service_order_api</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
	<dependency>
		<groupId>com.changgou</groupId>
		<artifactId>changgou_common</artifactId>
		<version>1.0-SNAPSHOT</version>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
   		<artifactId>spring-boot-starter-thymeleaf</artifactId>
	</dependency>
</dependencies>
		

(2)application.yml配置

server:
  port: 9011
spring:
  application:
    name: order-web
  main:
    allow-bean-definition-overriding: true   #当遇到同样名字的时候,是否允许覆盖注册
  thymeleaf:
    cache: false
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:6868/eureka
  instance:
    prefer-ip-address: true
feign:
  hystrix:
    enabled: true
  client:
    config:
      default:   #配置全局的feign的调用超时时间  如果 有指定的服务配置 默认的配置不会生效
        connectTimeout: 60000 # 指定的是 消费者 连接服务提供者的连接超时时间 是否能连接  单位是毫秒
        readTimeout: 80000  # 指定的是调用服务提供者的 服务 的超时时间()  单位是毫秒
#hystrix 配置
hystrix:
  command:
    default:
      execution:
        timeout:
          #如果enabled设置为false,则请求超时交给ribbon控制
          enabled: true
        isolation:
          strategy: SEMAPHORE
          thread:
            # 熔断器超时时间,默认:1000/毫秒
            timeoutInMilliseconds: 80000
#请求处理的超时时间
ribbon:
  ReadTimeout: 4000
  #请求连接的超时时间
  ConnectTimeout: 3000

(3)创建启动类
创建com.changgou.OrderApplication启动类,代码如下:

package com.changgou.web.order;

import com.changgou.interceptor.FeignInterceptor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {
   
   "com.changgou.order.feign"})
public class WebOrderApplication {
   
   

    public static void main(String[] args) {
   
   
        SpringApplication.run(WebOrderApplication.class,args);
    }

    @Bean
    public FeignInterceptor feignInterceptor(){
   
   
        return  new FeignInterceptor();
    }
}

(4)静态资源拷贝
资源\成品页面\cart.html页面拷贝到工程中,如下图:

在这里插入图片描述

3.2购物车列表渲染

3.2.1feign创建

在changgou_service_order_api中添加CartFeign接口,并在接口中创建添加购物车和查询购物车列表,代码如下:

package com.changgou.order.feign;

import com.changgou.entity.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

@FeignClient(name = "order")
public interface CartFeign {
   
   

    @GetMapping("/cart/addCart")
    public Result addCart(@RequestParam("skuId") String skuId, @RequestParam("num") Integer num);

    @GetMapping("/cart/list")
    public Map list();
}

在changgou_web_order中创建com.changgou.order.controller.CartController,并添加查询购物车集合方法和添加购物车方法,代码如下:

package com.changgou.web.order.controller;

import com.changgou.entity.Result;
import com.changgou.entity.StatusCode;
import com.changgou.order.feign.CartFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping
### 购物车组件只渲染一条数据的解决方案 购物车组件只渲染一条数据的问题通常与数据绑定和渲染逻辑有关。以下是可能的原因及解决方案: #### 1. 数据源问题 如果购物车的数据源(如 `cart.json` 或 `data` 中定义的数组)仅包含一条数据,那么渲染结果自然也只会显示一条数据。需要确保数据源中包含多条商品信息[^1]。 ```javascript data() { return { cartItems: [] // 确保这是一个数组,并且在加载时正确填充 }; } ``` #### 2. 数据加载逻辑问题 在加载数据时,如果方法未正确将所有数据添加到 `data` 中的数组变量中,可能会导致渲染问题。例如,在 `mounted` 钩子中调用的方法需要确保返回的是一个完整的数组[^1]。 ```javascript methods: { loadCartData() { fetch('cart.json') // 假设这是加载数据的接口 .then(response => response.json()) .then(data => { this.cartItems = data; // 确保将整个数组赋值给 cartItems }); } }, mounted() { this.loadCartData(); // 页面加载完成后自动调用数据加载方法 } ``` #### 3. 模板渲染逻辑问题 模板中的列表渲染逻辑需要使用 `v-for` 指令来遍历数组。如果模板中未正确使用 `v-for`,则可能导致只渲染第一条数据[^1]。 ```html <ul> <li v-for="item in cartItems" :key="item.id"> {{ item.name }} - {{ item.price }} <button @click="removeFromCart(item.id)">删除</button> </li> </ul> ``` #### 4. 删除操作影响数据完整性 如果删除操作的逻辑存在问题,可能会导致数据被意外清空或只保留一条记录。例如,删除逻辑中使用了错误的过滤条件[^4]。 ```javascript methods: { removeFromCart(id) { this.cartItems = this.cartItems.filter(item => item.id !== id); // 正确过滤掉指定ID的商品 } } ``` #### 5. 数据更新机制问题 如果框架的数据绑定机制未能正确检测到数据的变化,可能会导致视图未及时更新。对于 Vue.js,确保数据是响应式的,并且在修改数组时使用 Vue 提供的数组变异方法(如 `splice`、`push` 等),而不是直接重新赋值[^1]。 ```javascript this.cartItems.push(newItem); // 使用 push 方法添加新商品 ``` --- ### 示例代码 以下是一个完整的购物车组件示例,解决了只渲染一条数据的问题: ```vue <template> <div> <h3>购物车</h3> <ul> <li v-for="item in cartItems" :key="item.id"> {{ item.name }} - {{ item.price }} <button @click="removeFromCart(item.id)">删除</button> </li> </ul> <button @click="addSampleData">添加示例数据</button> </div> </template> <script> export default { data() { return { cartItems: [] // 初始化为空数组 }; }, methods: { loadCartData() { fetch('cart.json') .then(response => response.json()) .then(data => { this.cartItems = data; // 确保加载所有数据 }); }, removeFromCart(id) { this.cartItems = this.cartItems.filter(item => item.id !== id); // 正确删除逻辑 }, addSampleData() { const sampleData = [ { id: 1, name: '商品A', price: 100 }, { id: 2, name: '商品B', price: 200 }, { id: 3, name: '商品C', price: 300 } ]; this.cartItems = [...this.cartItems, ...sampleData]; // 添加示例数据 } }, mounted() { this.loadCartData(); // 页面加载时自动加载数据 } }; </script> ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值