灏天阁

vue3.2/Vite/Ts71: 展示已有SKU

· Yin灏

目录结构

└─src
    ├─api
    │  └─product
    │      └─sku
    │          ├─index.ts
    │          └─type.ts
    └─views
        └─product
            └─sku
                └─index.vue

设置获取 SKU 接口

src/api/product/sku/index.ts

import request from "@/utils/request";
import type { SkuResponseData } from "./type";

enum API {
  SKU_URL = "/admin/product/list/",
}

export const reqSkuList = (page: number, limit: number) =>
  request.get<any, SkuResponseData>(API.SKU_URL + `${page}/${limit}`);

定义 TS 类型

src/api/product/sku/type.ts

export interface ResponseData {
  code: number;
  message: string;
  ok: boolean;
}

export interface Attr {
  attrId: string | number;
  valueId: string | number;
}

export interface SaleAttr {
  saleAttrId: string | number;
  saleAttrValueId: string | number;
}

export interface SkuData {
  category3Id: string | number;
  spuId: string | number;
  tmId: string | number;
  skuName: string;
  price: string | number;
  weight: string | number;
  skuDesc: string;
  skuAttrValueList?: Attr[];
  skuSaleAttrValueList?: SaleAttr[];
  skuDefaultImg: string;
  isSale?: number;
  id?: number;
}

export interface SkuResponseData extends ResponseData {
  data: {
    records: SkuData[];
    total: number;
    size: number;
    current: number;
    orders: [];
    optimizeCountSql: boolean;
    hitCount: boolean;
    countId: null;
    maxLimit: null;
    searchCount: boolean;
    pages: number;
  };
}

发送请求

src/views/product/sku/index.vue

<template>
  <el-card :data="skuArr">
    <el-table border>
      <el-table-column
        label="序号"
        type="index"
        align="center"
        width="80px"
      ></el-table-column>
      <el-table-column
        label="名称"
        show-overflow-tooltip
        width="150px"
        prop="skuName"
      ></el-table-column>
      <el-table-column
        label="描述"
        show-overflow-tooltip
        width="150px"
        prop="skuDesc"
      ></el-table-column>
      <el-table-column label="图片">
        <template #="{ row }">
          <img
            :src="row.skuDefaultImg"
            style="width:100px;height:100px"
            alt=""
          />
        </template>
      </el-table-column>
      <el-table-column
        label="重量"
        width="150px"
        prop="weight"
      ></el-table-column>
      <el-table-column
        label="价格"
        width="150px"
        prop="price"
      ></el-table-column>
      <el-table-column label="操作" width="250px" fixed="right">
        <template #="{ row }">
          <el-button type="primary" size="small" icon="Top"></el-button>
          <el-button type="primary" size="small" icon="Edit"></el-button>
          <el-button type="primary" size="small" icon="Info"></el-button>
          <el-button type="primary" size="small" icon="Delete"></el-button>
        </template>
      </el-table-column>
    </el-table>
    <!-- 分页器 -->
    <el-pagination
      v-model:current-page="pageNo"
      v-model:page-size="pageSize"
      :page-sizes="[10, 20, 30, 40]"
      :background="true"
      layout="prev, pager, next, jumper, -> , sizes, total"
      :total="total"
      @current-change="getHasSku"
      @size-change="handler"
    ></el-pagination>
  </el-card>
</template>
<script setup lang="ts">
  import { ref, onMounted } from "vue";
  import { reqSkuList } from "@/api/product/sku";
  import type { SkuResponseData, SkuData } from "@/api/product/sku/type";

  let pageNo = ref<number>(1);
  let pageSize = ref<number>(10);

  let total = ref<number>(0);
  let skuArr = ref<SkuData[]>([]);

  const getHasSku = async (pager = 1) => {
    pageNo.value = pager;
    const result: SkuResponseData = await reqSkuList(
      pageNo.value,
      pageSize.value
    );
    if (result.code === 200) {
      total.value = result.data.total;
      skuArr.value = result.data.records;
    }
  };

  const handler = async (pageSizes: number) => {
    getHasSku();
  };

  onMounted(() => {
    getHasSku();
  });
</script>

- Book Lists -