Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(八)

今天开始使用 vue3 + ts 搭建一个项目管理的后台,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏,学习更多前端vue知识,然后开篇先简单介绍一下本项目用到的技术栈都有哪几个方面(阅读本文章能够学习到的技术):

vite:快速轻量且功能丰富的前端构建工具,帮助开发人员更高效构建现代Web应用程序。

pnpm:高性能、轻量级npm替代品,帮助开发人员更加高效地处理应用程序的依赖关系。

Vue3:Vue.js最新版本的用于构建用户界面的渐进式JavaScript框架。

TypeScript:JavaScript的超集,提供了静态类型检查,使得代码更加健壮。

Animate:基于JavaScript的动画框架,它使开发者可以轻松创建各种炫酷的动画效果。

vue-router:Vue.js官方提供的路由管理器与Vue.js紧密耦合,非常方便与Vue.js一同使用。

Pinia:Vue3构建的Vuex替代品,具有响应式能力,提供非常简单的 API,进行状态管理。

element-plus:基于Vue.js 3.0的UI组件库,用于构建高品质的响应式Web应用程序。

axios:基于Promise的HTTP客户端,可以在浏览器和node.js中使用。

three:基于JavaScript的WebGL库,开发者可以编写高性能、高质量的3D场景呈现效果。

echarts:基于JavaScript的可视化图表库,支持多种类型的图表,可根据需要自行安装。

当然还有许多其他的需要安装的第三方库,这里就不再一一介绍了,在项目中用到的地方自行会进行讲解,大家自行学习即可,现在就让我们走进vue3+ts的实战项目吧。

目录

SKU模块搭建

SKU商品的上架与下架

查看商品详情与删除商品


SKU模块搭建

在SKU模块搭建时,仍然采用的是element-plus提供的组件库,这里采用的卡片里面嵌套表格和分页器的样式,自己可自行去element官网去查看,这里不再赘述,样式如下:

<template>
  <el-card>
    <el-table border style="margin: 10px 0px" :data="skuArr">
      <el-table-column label="序号" type="index" align="center" width="80px"></el-table-column>
      <el-table-column label="名称" show-overflow-tooltip width="300px" prop="skuName"></el-table-column>
      <el-table-column label="描述" show-overflow-tooltip width="400px" prop="skuDesc"></el-table-column>
      <el-table-column label="图片" width="200px">
        <template #default="{ row }">
          <img :src="row.skuDefaultImg" style="width: 100px; height: 100px" />
        </template>
      </el-table-column>
      <el-table-column label="重量" width="100px" prop="weight"></el-table-column>
      <el-table-column label="价格" width="100px" prop="price"></el-table-column>
      <el-table-column label="操作" width="300px" fixed="right">
        <template #default>
          <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="InfoFilled"></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-card>
</template>

接下来通过编写接口函数来获取数据,如下:

// SKU模块接口管理
import request from '@/utils/request'
// 引入ts类型
import type { SkuResponseData } from './type'
// 枚举地址
enum API {
  // 获取已有的商品的数据
  SKU_URL = '/admin/product/list/',
}
// 获取商品SKU的接口
export const reqSkuList = (page: number, limit: number) =>
  request.get<any, SkuResponseData>(API.SKU_URL + `${page}/${limit}`)

在SKU组件中引入该接口函数以及相关存放响应式ref的数据,如下:

import { ref, onMounted } from 'vue'
// 引入接口请求
import { reqSkuList } from '@/api/product/sku'
// 引入ts类型
import type { SkuResponseData, SkuData } from '@/api/product/sku/type'
// 分页器当前页码
let pageNo = ref<number>(1)
// 每一页展示几条数据
let pageSize = ref<number>(10)
// 数据总数
let total = ref<number>(0)
// SKU数据
let skuArr = ref<SkuData[]>([])

使用 onMounted 函数,当组件刚挂载的时候就获取数据,分页器发生变化时也调用获取SKU数据的函数,如下:

// 组件挂载完毕
onMounted(() => {
  getHasSku()
})
const getHasSku = async (pager = 1) => {
  // 当前分页器的页码
  pageNo.value = pager
  let result: SkuResponseData = await reqSkuList(pageNo.value, pageSize.value)
  if (result.code == 200) {
    total.value = result.data.total
    skuArr.value = result.data.records
  }
}
// 分页器下拉菜单发生变化时触发
const handler = () => {
  getHasSku()
}

SKU商品的上架与下架

商品的上架与下架数据也是要和数据库进行交互的,所以这里需要编写上架与下架相关的接口:

上架和下架的图标我们要进行动态的显示,这里借助三元表达式根据上架和下架的变量isSale数值等于0还是1进行相关的判断:

当然这里通过设置一个点击事件来进行相关的判断,商品是处于上架还是下架的状态,如下:

// 商品的上架与下架操作
const updateSale = async (row: SkuData) => {
  // 如果当前商品的 isSale==1 说明当前商品是上架的额状态->更新为下架
  if (row.isSale == 1) {
    // 下架操作
    let result = await reqCancelSale(row.id as number)
    console.log(result)
    // 提示信息
    ElMessage({
      type: 'success',
      message: '下架成功!',
    })
    // 发请求再次获取已有的SKU
    getHasSku(pageNo.value)
  } else {
    console.log(row.id)
    // 上架操作
    await reqSaleSku(row.id as number)
    row.isSale = 1
    // 提示信息
    ElMessage({
      type: 'success',
      message: '上架成功!',
    })
    // 发请求再次获取已有的SKU
    getHasSku(pageNo.value)
  }
}

SKU的修改按钮的话,我们这里设置一下弹框提示正在修理中,如下:

// 更新已有的SKU
const updateSku = () => {
  ElMessage({ type: 'success', message: '程序员在努力的更新中...' })
}

查看商品详情与删除商品

查看商品详情,这里使用是element组件库给我们提供的一个抽屉效果,如下:

这里设置一个点击事件,通过点击事件来控制抽屉是否显示:

通过点击设置,将抽屉进行显示出来的同时,调用获取相关SKU的接口函数获取相关SKU数据并保存在响应式ref变量中进行使用:

// 查看商品详情按钮的回调
const findSku = async (row: SkuData) => {
  // 抽屉展示出来
  drawer.value = true
  // 获取相关SKU数据
  let result: SkuInfoData = await reqSkuInfo(row.id as number)
  // 存储已有的SKU
  skuInfo.value = result.data
}

这里的抽屉内容采用了栅格样式进行布局,标题和内容在同一行以 1:3 的布局进行排列,如下:

最后的结果如下:

实现商品删除的功能很简单,只需要调用接口函数,然后传递相关要删除商品的id即可,如下

在删除按钮处,用element组件库中的气泡确认框包裹,在前几篇的文章中都有讲解到该用法,这里不再赘述,如下:

最后通过气泡确认框的confirm函数进行实现删除功能,如下:

// 删除某一个已有的商品
const removeSku = async (id: number) => {
  // 删除某一个已有商品的情况
  let result: any = await reqRemoveSku(id)
  if (result.code == 200) {
    // 提示信息
    ElMessage({ type: 'success', message: '删除成功!' })
    // 再次获取全部的数据
    getHasSku(skuArr.value.length > 1 ? pageNo.value : pageNo.value - 1)
  } else {
    // 删除失败
    ElMessage({ type: 'error', message: '删除失败!' })
  }
}

本项目的SKU管理页面功能的搭建就讲解到这,下一篇文章将继续讲解其它模块的主体内容,关注博主学习更多前端vue知识,您的支持就是博主创作的最大动力! 

猜你喜欢

转载自blog.csdn.net/qq_53123067/article/details/131361915