上一篇已經處理了登入的跨域請求問題,但目前登入後的商品服務無法取得列表

現在預設的請求都會轉給ren-fast,但product應該轉給商品服務才對,所以API Gateway必須再修改

        - id: product_route
          uri: lb://yumall-product
          predicates:
            - Path=/api/product/**
          filters:
            - RewritePath=/api(?<segment>.*), /$\{segment}

負載平衡到product,然後判斷依據一樣使用路徑進行斷言,並且加上過濾器(filter)讓路徑重寫成把/api字串去掉後面的部分則一樣,但目前商品服務還沒加入nacos,所以要在yumall-product新增bootstrap.properties檔案

spring.application.name=yumall-product

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=49d83e8b-0b74-4fe2-b7ba-a5496b990dce

namespace 這部分要在nacos新增名稱空間後把這串UUID寫在設定檔

在application.yml加上nacos設定

spring:
  datasource:
    username: demo
    password: xxxxx
    url: jdbc:mysql://localhost:3306/yumall_pms
    driver-class-name: com.mysql.cj.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

一樣要開啟服務註冊

儲存重啟,檢查nacos,服務註冊都放在public,不做隔離,其他的設定檔才需要做隔離

測試看API (http://localhost:88/api/product/category/list/tree)

{
 msg: "invalid token",
 code: 401
}

發現這是ren-fast出現的警告訊息(非法token),如果沒登入就會出現,表示在請求經過Filters時,是先經過ren-fast的Filter,所以要調整一下API Gateway的規則順序

再一次打API(http://localhost:88/api/product/category/list/tree)

成功取得資料

取得資料後要在頁面上顯示,所以要在使用VScode修改

到商品列表頁面可以看到,取到的資料都是放在data中

因此在category.vue可以將data弄成一個解構賦值的格式來存放資料

將data加上大刮號,從data中取得名稱為data的屬性(data.data)

存檔後測試

成功取得data資料,然後再把這些資料放在方法裡面讓elementUI去產生,一樣修改category.vue,將:data綁定的資料改成menus,並且在data()也改成menus

<template>
  <div>
    <el-tree
      :data="menus"
      :props="defaultProps"
      @node-click="handleNodeClick"
    ></el-tree>
  </div>
</template>
export default {
  // import載入的組件需要注入到物件中才能使用
  components: {},
  props: {},
  data() {
    return {
      menus: [],
      defaultProps: {
        children: "children",
        label: "label",
      },
    };
  },

然後在this.menus=data.data把剛取出的資料放入綁定的menus

getMeuns() {
      this.$http({
        url: this.$http.adornUrl("/product/category/list/tree"),
        method: "get",
      }).then(({ data }) => {
        this.menus = data.data;
        console.log("成功取得選單資料:", data.data);
      });
    },

可以看到目前項目有出現了,但是沒有文字,參考ElementUI官網的Tree,要讓名稱顯示就要再調整

從上一步取得的資料發現children就是子節點了,而這裡每個節點的name要顯示在頁面上,從官網的props來看,必須要修改的是label,所以要再修改category.vue

label: “name"

儲存後測試

成功顯示