用 Vue3 写一个销售管理系统

发布时间:2026/9/23 9:02:09

用 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!
延伸阅读

更多相关文章

2026/9/19 23:52:30

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/9/23 8:59:40

Funplay Unity MCP execute_code:AI驱动Unity开发的代码沙盒与执行引擎

1. 项目概述:为什么execute_code是 MCP 皇冠上的明珠在 AI 驱动的开发浪潮中,Model Context Protocol (MCP) 正迅速成为连接智能体与专业工具的“标准插座”。市面上涌现了成百上千的 MCP 工具,从代码分析、UI 设计到数据库管理,琳…

2026/9/19 11:41:13

系统卡顿排查指南:从死锁到线程池问题的实战诊断

在实际开发中,我们经常会遇到一种情况:一个任务或进程因为各种原因被“卡住”了,无法继续执行,也无法正常退出。这种现象在分布式系统、并发编程、数据库操作和网络通信中尤为常见。对于开发者而言,面对一个“I cant m…

2026/9/23 8:57:44

AI论文降重技巧:如何有效规避查重系统检测

1. 项目背景与核心痛点去年帮学弟改论文时发现个有趣现象:他用AI辅助生成的文献综述部分,在知网查重时被标红率高达80%。这并非传统意义上的抄袭,而是AI生成内容特有的"机器味"被查重系统识别为异常文本。这种现象在2023年后变得尤…

2026/9/23 8:57:44

开源+本地化部署实战:企业AI落地的关键路径与避坑指南

直接说结论:2026年这个时间节点,技术选型里最值得下注的不是某个具体框架,而是“开源本地化部署”这套组合拳。我自己过去大半年做的项目,从最初评估到最后落地,全部围绕这个核心展开。这篇文章不聊虚的,只…

2026/9/23 8:57:44

Oracle Hyperion合并报表国产替换怎么选?2026信创选型全攻略

随着 Oracle 海波龙(Hyperion)面临停服风险与信创合规要求,国产 EPM 合并报表产品已进入成熟替代期。海波龙停服不是传闻,而是已经落地的事实Oracle 早在 2021 年 12 月就已停止为该版本发布新的修复和安全补丁,11.1.2…

2026/9/23 8:57:44

身份证验证接口开发指南:原理、实践与优化

1. 身份证验证接口核心价值与应用场景身份证验证接口作为现代互联网服务的基础设施,其核心价值在于通过标准化方式实现"姓名-身份证号"一致性校验。与人工审核相比,这种自动化验证方式将原本需要几分钟甚至几小时的流程缩短至毫秒级&#xff0…

2026/9/23 8:57:44

三星Note2 N7100线刷救砖全攻略:Odin刷机教程与常见问题解决

1. 为什么现在还有人折腾三星Note2 N7100线刷三星Galaxy Note2 N7100是2012年发布的机型,放到现在已经有十多年历史。很多人觉得这机器早该进博物馆了,但实际情况是,二手市场流通量依然不小,而且有一批固定用户群体在持续使用——…

2026/9/23 8:52:44

Chip Genius原理与实战:U盘主控芯片识别技术解析

1. Chip Genius不是“U盘身份证”,而是主控芯片的X光机很多人第一次听说Chip Genius,是在U盘买回来发现容量虚标、速度慢得离谱、频繁掉盘的时候。朋友甩来一句:“你这U盘是不是扩容盘?拿Chip Genius扫一下就知道了。”——听起来…

2026/9/22 10:02:42

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/22 9:07:39

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/23 0:01:54

3个实战技巧搞定形式英语:从看教程到跑通性能优化

3个实战技巧搞定形式英语:从看教程到跑通性能优化 看了一堆教程还是不会写项目?别慌,这种“眼高手低”的困境在开发者圈子里太常见了。很多人以为卡点在语法,其实真正拦路虎是缺乏将知识点串联成完整链路的能力。今天咱们不聊虚的,直接拿【形式英语】这…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码