欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > Vue + TS + MySQL实战示例四:优化商品管理系统

Vue + TS + MySQL实战示例四:优化商品管理系统

2025/2/8 5:34:52 来源:https://blog.csdn.net/m0_50892002/article/details/144229677  浏览:    关键词:Vue + TS + MySQL实战示例四:优化商品管理系统

在前面的实战示例中,我们已经构建了一个基本的商品管理系统,实现了商品的添加、查询、更新和删除操作。然而,在实际应用中,我们还需要对系统进行进一步的优化,以提升用户体验和系统性能。本示例将重点介绍如何在现有商品管理系统的基础上进行优化,包括添加商品图片上传功能、优化查询性能以及改进用户界面交互。

一、添加商品图片上传功能

  1. 前端实现
    • 安装依赖:在Vue项目中,我们需要安装vue-dropzone库来实现文件上传功能。运行以下命令进行安装:
npm install vue-dropzone
- 在组件中使用:在`ProductManagement.vue`组件中,引入`vue-dropzone`并进行配置。首先,在`<script>`标签内添加以下导入语句:
import Dropzone from 'vue-dropzone';
import 'vue-dropzone/dist/vueDropzone.min.css';

然后,在components选项中注册Dropzone组件:

components: {Dropzone
}

接着,修改模板部分,添加文件上传区域:

<template><div class="product-management-container"><!-- 其他代码 --><h3>商品图片上传</h3><dropzone ref="myDropzone" :options="dropzoneOptions" @vdropzone-complete="handleUploadComplete"><div class="dz-message needsclick">点击或拖拽文件上传</div></dropzone></div>
</template>

data函数中,添加dropzoneOptions配置对象:

data() {return {// 其他数据dropzoneOptions: {url: '/api/upload-product-image',maxFilesize: 2,maxFiles: 1,acceptedFiles: 'image/*'}};
}

这里配置了上传的URL(我们将在后端实现这个接口)、最大文件大小、最大文件数量以及允许上传的文件类型。同时,添加handleUploadComplete方法来处理上传完成后的事件:

methods: {// 其他方法handleUploadComplete(file: any) {console.log('文件上传完成:', file);// 这里可以将上传后的文件路径保存到商品数据中,后续更新商品时一并提交到后端}
}
  1. 后端实现
    • 安装依赖:在后端项目中,我们需要安装multer库来处理文件上传。运行以下命令:
npm install multer
- 创建上传路由:在`product.routes.js`文件中,添加以下代码来定义文件上传路由:
const multer = require('multer');
const storage = multer.diskStorage({destination: function (req, file, cb) {cb(null, 'public/images'); // 设置文件上传的目标文件夹,确保该文件夹存在},filename: function (req, file, cb) {cb(null, Date.now() + '-' + file.originalname); // 为上传的文件生成唯一的文件名}
});
const upload = multer({ storage });router.post('/upload-product-image', upload.single('productImage'), (req, res) => {try {const file = req.file;if (!file) {return res.status(400).json({ message: '没有文件上传' });}const imagePath = file.path.replace('public', ''); // 返回相对路径,方便存储到数据库res.status(200).json({ imagePath });} catch (error) {console.error('文件上传失败:', error);res.status(500).json({ message: '文件上传失败,请稍后重试' });}
});

这段代码配置了multer来处理文件上传,将上传的文件保存到public/images文件夹(可根据实际需求调整),并返回上传文件的相对路径给前端。

二、优化查询性能

  1. 添加索引
    在MySQL数据库中,为经常用于查询条件的字段添加索引可以显著提高查询速度。对于商品管理系统,我们可以为nameprice等字段添加索引。在数据库管理工具(如MySQL Workbench)中执行以下SQL语句:
ALTER TABLE products ADD INDEX idx_name (name);
ALTER TABLE products ADD INDEX idx_price (price);

添加索引后,查询操作在这些字段上的性能将得到提升,但需要注意索引的维护也会带来一定的开销,所以应根据实际情况合理选择添加索引的字段。

  1. 分页查询
    当商品数量较多时,一次性查询所有商品可能会导致性能问题。我们可以实现分页查询功能,只获取当前页面所需的商品数据。
    • 前端修改:在ProductManagement.vue组件中,添加分页相关的数据和方法。在data函数中添加:
currentPage: 1,
pageSize: 10

修改getProducts方法,添加分页参数:

async getProducts() {try {const response = await axios.get(`/api/products?page=${this.currentPage}&size=${this.pageSize}`);this.products = response.data;} catch (error) {console.error('获取商品列表失败:', error);}
}

同时,添加分页按钮的点击事件处理方法,例如prevPagenextPage方法来切换页面:

prevPage() {if (this.currentPage > 1) {this.currentPage--;this.getProducts();}
}nextPage() {this.currentPage++;this.getProducts();
}
- 后端修改:在`product.routes.js`文件中的`/products`路由处理函数中,添加分页逻辑。修改后的代码如下:
router.get('/products', async (req, res) => {try {const page = parseInt(req.query.page as string) || 1;const size = parseInt(req.query.size as string) || 10;const offset = (page - 1) * size;const products = await Product.findAll({limit: size,offset});res.status(200).json(products);} catch (error) {console.error('获取商品列表失败:', error);res.status(500).json({ message: '获取商品列表失败,请稍后重试' });}
});

这里根据前端传递的pagesize参数计算偏移量,使用limitoffset实现分页查询。

三、改进用户界面交互

  1. 实时验证输入
    在添加商品表单中,为用户输入的字段添加实时验证功能,例如验证价格是否为数字、库存数量是否为非负整数等。可以使用Vue的v-on:input事件和正则表达式来实现简单的验证,并及时显示错误提示信息给用户。
  2. 优化操作反馈
    在进行添加、编辑、删除等操作时,为用户提供更明确的操作反馈。例如,在点击添加商品按钮后,显示一个加载动画,直到操作完成并显示成功或失败的提示信息。可以使用Vue的loading组件或自定义加载动画来实现。

通过以上优化措施,我们的商品管理系统在功能和性能上都得到了进一步的提升。用户可以上传商品图片,查询性能得到改善,并且用户界面交互更加友好。在实际项目开发中,还可以根据具体需求继续优化和扩展系统,如添加商品分类管理、用户权限控制、数据统计等功能。希望本示例对你在Vue + TS + MySQL项目的优化过程中有所帮助,如果你有任何疑问或建议,欢迎在评论区留言。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com