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

news2025/7/5 12:42:03

今天开始使用 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知识,您的支持就是博主创作的最大动力! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从小白到大神之路之学习运维第49天---第三阶段----MHA高可用集群数据库的安装部署

第三阶段基础 时 间&#xff1a;2023年6月29日 参加人&#xff1a;全班人员 内 容&#xff1a; MHA高可用数据库集群 目录 一、MHA基础 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;发挥过程 &#xff08;三&#xff09;组成 &#xff08;四&#x…

Quiz 5: Loops and Iterations | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 5: Loops and Iterations 单选题&#xff08;1-10&#xff09;编程题Exercise 5.2 课程简介 Python for Everybody 零基础程序设计&#xff08;Python 入门&#xff09; This course aims to teach everyone the basics of programming computers using…

C++语法练习(牛客题库)——练习1

1. 下列程序的运行结果是 1*2 3*4&#xff0c;那么横线处缺失程序可以是&#xff08;&#xff09; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <iostream> using namespace std; class Test{ public: Test(int a, int b) { …

【运维知识进阶篇】zabbix5.0稳定版详解6(zabbix自动化监控:自动发现+自动注册+监控项目主动式)

本篇文章继续给大家介绍zabbix自动化监控&#xff0c;包括zabbix自动注册&#xff0c;zabbix自动发现&#xff0c;将主机添加进服务端之后需要做的监控项目更改为主动式&#xff0c;zabbix说多不多&#xff0c;说少不少&#xff0c;其实远没有监控那么简单&#xff0c;更深层次…

【运维知识进阶篇】zabbix5.0稳定版详解7(zabbix分布式监控:使用场景+功能详解+快速部署+基本使用)

如果你有几百上千台客户端的数据需要上报给zabbix服务端&#xff0c;即便是你做了主动注册&#xff0c;监控项目主动式&#xff0c;那服务端压力还是会很大&#xff0c;所以我们可以考虑zabbix分布式监控。 zabbix proxy可以代替zabbix server收集性能和可用性数据&#xff0c…

【HTTP 协议1】图文详解 HTTP 请求和应答报文

文章目录 前言一、认识 HTTP 协议1, 什么是 HTTP 协议2, HTTP 协议的报文格式 二、HTTP 请求报文1, 认识方法1.1, GET 和 POST 辨析(重点)1.2, 其他方法 2, 认识 URL3, 认识 Header3.1, Host3.2, Content-Length3.3 Content-Type3.4, User-Agent3.5, Referer3.6, Cookie(重点) …

源代码|大屏可视化系统 数据可视化

代码拿来即可用&#xff0c;按照下文步骤配置&#xff0c;傻瓜式教程&#xff0c;几分钟即可搞定。 需要代码源文件&#xff0c;请移步至gzh【李桥桉】&#xff0c;s辛【可视化】。 可视化效果图 运行环境&#xff1a;VScode 文末附《大屏可视化系统》源代码获取方式~ 一、打…

数据结构--顺序栈的实现

数据结构–顺序栈的实现 顺序栈的定义 顺序栈的定义代码实现 #define MaxSize 10 typedef struct {ElemType data[MaxSize]; //静态数组存放栈中元素int top; //栈顶指针 } SqStack;int main() {SqStack S; //声明一个顺序栈(分配空间)//... ...return 0; }一些常见操作 初始…

大数据的金融数据读取及分析(-)

由于考虑商业数据问题&#xff0c;我们用开源数据做演示 一.tushare开源数据 Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程&#xff0c;能够为金融分析人员提供快速、整洁、和多样的便于分析的数据&#x…

postgresql_internals-14 学习笔记(七)—— parallel 并行

不完全来自这本书&#xff0c;把查到的和之前的文章重新汇总整理了一把。 一、 核心参数 几个容易弄混的进程和参数&#xff0c;关系图如下 1. max_worker_processes 整个实例可以同时运行的Background workers Processes最大数量默认值为8&#xff0c;设置为0表示禁用并行&…

STM32与树莓派:嵌入式系统开发与教育计算的区别

STM32和树莓派是两种不同的硬件平台&#xff0c;用于不同的应用领域。 STM32&#xff1a;STM32是一系列由STMicroelectronics&#xff08;意法半导体&#xff09;生产的32位ARM Cortex-M微控制器。它们被广泛用于嵌入式系统开发&#xff0c;包括消费电子产品、工业自动化、汽车…

CNN池化总结(最大池化与平均池化)

目录 概念 两种主要池化方式 最大池化 平均池化 尺寸变化过程 池化优点 总结 概念 池化&#xff08;Pooling&#xff09;&#xff0c;用于减小卷积神经网络&#xff08;CNN&#xff09;或其他类型神经网络的特征图&#xff08;Feature Map&#xff09;的尺寸&#xff0…

java 网络教学平台Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 JSP 网络教学平台 是一套完善的系统源码&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S模式开发。 研究的基本内容是基于Web的网络教学平台&…

【SWAT水文模型】SWAT-CUP参数率定过程问题总结

SWAT-CUP参数率定过程问题总结 Q1 SWAT-CUP中calibrate按钮一直是灰色无法点击?1.1 问题描述1.2 解决办法 Q2 “SWAT”不是内部命令1.1 问题描述1.2 解决办法 参考 Q1 SWAT-CUP中calibrate按钮一直是灰色无法点击? 1.1 问题描述 软件是从2W2E上下载的SWAT-CUP2019&#xff…

XILINX ZYNQ 7000 BOOT

参考UG585 内容 下面这张图是ZYNQ启动的关键流程 1.POR表示硬件复位&#xff0c;不关心Power-up也就是说冷热启动都行。Nor-POR就是非POR复位&#xff0c;有点软件应用复位的意思。 2.POR复位会复位所有寄存器。并且采集 HardWare boot pin的状态。这点很关键&#xff0c; 3.是…

mysql一些常用函数

group_concat()函数首先根据group by指定的列进行分组&#xff0c;并且用分隔符分隔&#xff0c;将同一个分组中的值连接起来&#xff0c;返回一个字符串结果。 group_concat([distinct] 字段名 [order by 排序字段 asc/desc] [separator 分隔符])-- 指定排序方式和分隔符 se…

STM32F407 滴答定时器

介绍STM32F407滴答定时器配置方法、使用方式&#xff0c;封装延时函数得到精确的时间。 【1】介绍滴答定时器的章节 STM32F407参考手册中第10章介绍了滴答定时器的校准值。 M4权威指南介绍滴答定时器的章节&#xff0c;M3权威指南中与M4权威指南中的介绍一样。 【2】滴答定时…

Windows 引导启动流程详述(BIOS-UEFI)

Windows 启动流程详述 BIOS 和 UEFI 的由来BIOS 存在哪里BIOS 程序的功能BIOS 和 UEFI 的发展由来如何查看当前计算机是什么方式引导启动呢&#xff1f;Linux 下如何查看 BIOS 大小&#xff1f; 启动流程详述使用 BIOS 进行系统启动流程使用 UEFI 进行系统启动流程SEC阶段PEI阶…

专项练习15

目录 一、选择题 1、如果要打开名为 “window2"的新窗口&#xff0c;可以通过&#xff08;&#xff09; 2、下列事件哪个不是由鼠标触发的事件&#xff08;&#xff09; 3、Angular指令中哪种作用域可以继承父scope 4、下列哪些事件不支持冒泡?&#xff08;&#xff09;…

微信小程序学习记录2 案例分享<智能家居UI>

效果 思路 页面分为4块 前三块 采用同样的class 替换三张矢量图 绑定三个单片机返回的JSON值 最后一块又分为左右两部分 左边部分 采用switch组件 绑定三个事件 右边部分则是普通的文字