用 Vue3 写一个销售管理系统
第一章 Vue3 核心语法与前端基础速览在动手前我们先建立扎实的语言基础。1.1 组合式 API 与script setupVue3 推荐使用组合式 API它将相关逻辑集中在一起。script setup更是让代码极度简洁script setup import { ref } from vue const msg ref(Hello Vue3) /script1.2 响应式核心refvsreactiveref包装基本类型或对象访问需.value适合独立值。reactive只能接收对象直接访问属性适合表单数据。const count ref(0) const form reactive({ name: , age: 18 })易错点reactive不能直接整个替换如form xxx否则会丢失响应用Object.assign(form, xxx)。1.3 计算属性和侦听器computed有缓存依赖变化才重算适合筛选、求和。watch用于监听数据变化执行副作用如搜索防抖。const filtered computed(() list.value.filter(i i.name.includes(keyword.value))) watch(filtered, (newVal) { /* 数据上报 */ })1.4 组件通信父传子defineProps子传父defineEmitsconst props defineProps([goods]) const emit defineEmits([add-to-cart])1.5 生命周期onMounted、onUnmounted是最常用的注意在onUnmounted清理定时器和事件监听。1.6 路由和状态管理Vue Router 4 的createRoutercreateWebHistoryPinia 的defineStore比 Vuex 更轻// router const router createRouter({ history: createWebHistory(), routes }) // store export const useStore defineStore(main, { state: () ({ count: 0 }), actions: { increment() { this.count } } })第二章 项目搭建与工程规范2.1 创建项目npm create vitelatest sell-vue3 -- --template vue安装依赖npm install vue-router4 pinia axios element-plus为什么要用 Vite启动快开发体验好。2.2 目录结构src/├── api/ # 接口封装│ ├── request.js│ ├── auth.js│ ├── goods.js│ └── order.js├── assets/ # 静态资源├── components/ # 通用组件│ ├── StarBackground.vue│ ├── Carousel.vue│ ├── Modal.vue│ ├── Pagination.vue│ └── SearchBar.vue├── router/ # 路由配置│ └── index.js├── stores/ # Pinia状态│ ├── user.js│ └── cart.js├── views/│ ├── Login.vue│ ├── Register.vue│ ├── Home.vue│ ├── GoodsList.vue│ ├── GoodsDetail.vue│ ├── Cart.vue│ ├── OrderList.vue│ └── Statistics.vue├── App.vue└── main.js原则页面负责组装组件负责复用API层统一请求状态层共享数据。第三章 认证与权限登录、注册、路由守卫3.1 登录/注册功能实现逻辑表单v-model绑定提交前做校验正则。调用 API 成功后保存 token 到localStorage同时更新 Pinia user store。跳转至原计划页面如redirect参数。易错点校验规则要健壮如密码长度、邮箱格式。// views/Register.vue 部分 const form reactive({ username: , password: , confirm: }) function validate() { if (form.password ! form.confirm) { alert(两次密码不一致) return false } return true }3.2 路由守卫实现逻辑在router.beforeEach中检查to.meta.requiresAuth和是否登录。同时处理“已登录访问登录页”的重定向。router.beforeEach((to, from, next) { const token localStorage.getItem(token) if (to.meta.requiresAuth !token) next(/login) else if (to.path /login token) next(/) else next() })3.3 退出登录逻辑清除 token调用注销接口跳转登录页。第四章 网络请求封装axios 拦截器4.1 为什么封装统一设置baseURL、超时。自动附加 token。统一错误处理避免每个页面重复代码。4.2 实现// api/request.js import axios from axios import { ElMessage } from element-plus const request axios.create({ baseURL: /api, timeout: 5000 }) // 请求拦截加 token request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) config.headers.Authorization Bearer ${token} return config }) // 响应拦截统一处理业务状态码 request.interceptors.response.use( response { const { code, data, msg } response.data if (code 200) return data ElMessage.error(msg) return Promise.reject(new Error(msg)) }, error { if (error.response?.status 401) { localStorage.removeItem(token) router.push(/login) // 或 location.href } ElMessage.error(error.response?.data?.msg || 网络错误) return Promise.reject(error) } )易错点拦截器返回的内容要与页面代码对齐避免双重弹窗。第五章 商品展示列表、搜索、筛选、分页5.1 列表获取onMounted中调用 API用ref接收数据。5.2 搜索与筛选computed输入关键字实时过滤结合分类下拉框const keyword ref() const category ref(all) const filteredList computed(() { return goodsList.value.filter(item { const matchKeyword item.name.toLowerCase().includes(keyword.value.toLowerCase()) const matchCategory category.value all || item.category category.value return matchKeyword matchCategory }) })易错点includes区分大小写需转换筛选条件多时可用every组合。5.3 分页使用slice或后端分页。前端分页适合小数据量后端分页适合大数据。const page ref(1) const pageSize ref(8) const pageData computed(() filteredList.value.slice((page.value-1)*pageSize.value, page.value*pageSize.value))易错点当筛选条件变化时重置 page 为 1。第六章 详情页与弹窗动态路由6.1 动态路由配置{ path: /goods/:id, component: GoodsDetail }6.2 详情页获取参数import { useRoute } from vue-router const route useRoute() onMounted(async () { const id route.params.id detail.value await getGoodsById(id) })6.3 模糊弹窗用于快速预览商品信息逻辑同前文3.3重点掌握Teleport和backdrop-filter。第七章 购物车与状态管理Pinia7.1 购物车设计state.items数组每项包含 id, name, price, count, selectedgetters.totalPrice计算总价actions.add/remove/updateCount/clear7.2 全局共享在 App.vue 的导航栏显示购物车数量所有页面都能访问。7.3 持久化监听 items 变化写入 localStorage// stores/cart.js export const useCartStore defineStore(cart, { state: () ({ items: JSON.parse(localStorage.getItem(cart)) || [] }), actions: { save() { localStorage.setItem(cart, JSON.stringify(this.items)) }, add(item) { const existing this.items.find(i i.id item.id) if (existing) existing.count else this.items.push({ ...item, count: 1 }) this.save() } } })易错点直接修改items中对象的属性响应式没问题但要确保save()调用。第八章 订单流程提交订单、订单列表、模拟支付8.1 提交订单从购物车读取 items发送到后端。成功后清空购物车跳转订单列表。8.2 订单列表使用refonMounted加载。显示订单状态待支付、已支付、已发货等。8.3 支付模拟点击“支付”按钮调用支付接口更新状态。易错点异步操作期间要加 loading 状态防止重复提交。第九章 图表统计可选整合引入 ECharts在onMounted初始化在数据变化时更新。import * as echarts from echarts onMounted(() { chart echarts.init(domRef.value) chart.setOption({ /* option配置 */ }) })易错点窗口尺寸变化时需chart.resize()组件卸载时要chart.dispose()。第十章 动效实现星星背景、轮播图、过渡动画10.1 星星背景Canvas之前已详述关键是requestAnimationFrame和鼠标交互。10.2 图片轮播之前已详述注意自动播放和边界处理。10.3 Vue 过渡动画用transition包裹元素实现淡入淡出、滑动效果。transition namefade div v-ifshow内容/div /transitionCSS.fade-enter-active, .fade-leave-active { transition: opacity 0.5s; } .fade-enter-from, .fade-leave-to { opacity: 0; }第十一章 易错点总结响应式丢失使用reactive时不要整体替换。定时器未清理setInterval必须在onUnmounted清除。事件监听未移除window.addEventListener需removeEventListener。路由守卫死循环登录页不要加requiresAuth。拦截器返回结构前后端约定好code/data/msg。购物车持久化读取和写入都要处理 JSON 解析异常。Canvas 尺寸使用canvas.width而非 CSS。分页与筛选冲突筛选后重置页码。结语这个销售管理系统虽然不大却浓缩了前端开发的核心知识点。通过亲手实现你会深刻理解 Vue3 的组合式 API、路由守卫、状态管理、网络请求封装等。希望我的博客能帮助你在学习路上少走弯路真正掌握实战技能。如果你觉得有用就点个赞吧有问题欢迎评论区交流。Happy Coding!

相关新闻

JASP统计分析软件完整指南:免费开源的SPSS终极替代方案

JASP统计分析软件完整指南:免费开源的SPSS终极替代方案

JASP统计分析软件完整指南:免费开源的SPSS终极替代方案 【免费下载链接】jasp-desktop JASP aims to be a complete statistical package for both Bayesian and Frequentist statistical methods, that is easy to use and familiar to users of SPSS 项目地址: …

2026/8/6 4:44:53 阅读更多 →
CCM中将饱和度设置为0,是怎么将图片变成黑白的?

CCM中将饱和度设置为0,是怎么将图片变成黑白的?

使图片变成黑白(灰色)的,就是让每个像素点的RGB值相等,即R=G=B。 CCM(Color Correction Matrix,色彩校正矩阵)是一个 33 的线性变换矩阵,将输入 RGB 映射到输出 RGB: $ \begin{bmatrix}R_{out}\G_{out}\B_{out}\end{bmatrix}=M⋅\begin{bmatrix}R_{in}\G_{in}\B_{in}\en…

2026/8/6 4:44:53 阅读更多 →
Nacos 1.x到2.x平滑升级实战:从评估到验证的完整指南

Nacos 1.x到2.x平滑升级实战:从评估到验证的完整指南

1. 项目概述:为什么必须从Nacos 1.3升级到2.3?最近在梳理手头的几个微服务项目,发现一个历史遗留问题:好几个项目的配置中心和注册中心还在用Nacos 1.3.2版本。这个版本是2020年发布的,虽然稳定,但已经落后…

2026/8/6 4:43:53 阅读更多 →

最新新闻

单片机毕设项目:基于 STM32 的三模式温控风机硬件监测平台开发 基于单片机的 DS18B20 传感智能排风调控装置实现(011202)

单片机毕设项目:基于 STM32 的三模式温控风机硬件监测平台开发 基于单片机的 DS18B20 传感智能排风调控装置实现(011202)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/6 22:07:31 阅读更多 →
炼化实验室射频校准,TM-060 信号源模拟测试信号探析

炼化实验室射频校准,TM-060 信号源模拟测试信号探析

油气炼化厂区的无线传感、防爆对讲、安防雷达依靠射频链路传递生产数据,各类通信元器件进场前,都需要在实验室开展信号模拟校验工作。TM-060 多制式射频信号发生器拥有较宽频段与完备的调制模式,能够输出高精度标准测试信号,在油气…

2026/8/6 22:07:31 阅读更多 →
无需服务器!PushPin本地优先架构详解:同步机制与离线协作原理

无需服务器!PushPin本地优先架构详解:同步机制与离线协作原理

无需服务器!PushPin本地优先架构详解:同步机制与离线协作原理 【免费下载链接】pushpin A collaborative corkboard app 项目地址: https://gitcode.com/gh_mirrors/push/pushpin PushPin是一款革命性的协作软木板应用,采用本地优先架…

2026/8/6 22:07:31 阅读更多 →
WiFi信道扫描:ESP32-Bit-Pirate分析周围网络信号强度的完整指南

WiFi信道扫描:ESP32-Bit-Pirate分析周围网络信号强度的完整指南

WiFi信道扫描:ESP32-Bit-Pirate分析周围网络信号强度的完整指南 【免费下载链接】ESP32-Bit-Pirate A Hardware Hacking Tool with Web-Based CLI That Speaks Every Protocol 项目地址: https://gitcode.com/GitHub_Trending/es/ESP32-Bit-Pirate ESP32-Bi…

2026/8/6 22:07:31 阅读更多 →
如何用TMSpeech快速实现智能会议纪要:Windows语音转文字的终极指南

如何用TMSpeech快速实现智能会议纪要:Windows语音转文字的终极指南

如何用TMSpeech快速实现智能会议纪要:Windows语音转文字的终极指南 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 你是否厌倦了在腾讯会议中疯狂打字记录要点?是否希望有个"智能小秘书…

2026/8/6 22:07:31 阅读更多 →
新手必看:LFM2.5-2.6B-mxfp8常见问题解决与最佳实践

新手必看:LFM2.5-2.6B-mxfp8常见问题解决与最佳实践

新手必看:LFM2.5-2.6B-mxfp8常见问题解决与最佳实践 【免费下载链接】LFM2.5-2.6B-mxfp8 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/LFM2.5-2.6B-mxfp8 LFM2.5-2.6B-mxfp8是一款基于MLX框架优化的高效文本生成模型,采用mxfp8量…

2026/8/6 22:06:31 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →