学习进度条
今日所花时间:三个小时
今日代码量:220行
博客量:一篇
了解到的知识点:
项目概述
基于 Vue.js 的设备管理系统前端页面,实现了设备管理、报修、地图定位和Excel导入导出等功能。本文将详细介绍这个项目中使用的技术和学到的知识点。
使用的主要技术
1. Vue 3 组合式 API
项目中大量使用了 Vue 3 的组合式 API,这是与 Vue 2 选项式 API 最大的不同:
import { ref, shallowRef, nextTick } from 'vue'
// 使用 ref 创建响应式变量
const addDeviceDrawerVisible = ref(false);
const deviceList = ref([]);
// 使用 shallowRef 创建非深度响应式变量(用于大型对象)
const map = shallowRef(null);
学到的知识点:
ref用于创建响应式的基本类型或对象shallowRef只对顶层属性做响应式处理,适合大型对象nextTick用于在 DOM 更新后执行代码
2. Element Plus 组件库
项目中使用了 Element Plus 提供的丰富组件:
<el-button type="primary" @click="addDevice">添加设备</el-button>
<el-table :data="deviceList" style="width: 100%" border>
<el-drawer v-model="addDeviceDrawerVisible" title="添加设备" direction="rtl" size="40%">
学到的知识点:
- 表单组件 (
el-form,el-form-item) - 表格组件 (
el-table,el-table-column) - 抽屉组件 (
el-drawer) - 对话框组件 (
el-dialog) - 上传组件 (
el-upload) - 分页组件 (
el-pagination)
3. 状态管理 Pinia
使用 Pinia 管理用户 token:
import { useTokenStore } from '@/stores/token'
// 获取用户ID
reportUserId: useTokenStore().token?.id
学到的知识点:
- Pinia 是 Vue 官方推荐的状态管理库
- 比 Vuex 更简单直观的 API
- 更好的 TypeScript 支持
4. 高德地图集成
使用 AMapLoader 加载高德地图:
import AMapLoader from '@amap/amap-jsapi-loader'
AMapLoader.load({
key: '8738c8766e88e47fc4a2f4d7f65ce315',
version: '2.0',
plugins: ['AMap.Geocoder', 'AMap.PlaceSearch', 'AMap.AutoComplete']
}).then((AMap) => {
// 初始化地图
})
学到的知识点:
- 异步加载地图 API
- 地图标记和事件处理
- 逆地理编码获取地址信息
5. Excel 导入导出
实现了 Excel 文件的导入和模板下载:
// 下载模板
const handleDownloadTemplate = async () => {
const response = await downloadDeviceTemplate()
const blob = new Blob([response], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
})
// 创建下载链接
}
// 导入Excel
const submitImport = async () => {
const formData = new FormData()
formData.append('file', file.raw)
await uploadDeviceByExcel(formData)
}
学到的知识点:
- 使用 Blob 处理二进制文件
- FormData 上传文件
- 文件类型验证和大小限制
6. 表单验证与提交
实现了复杂的表单验证和提交逻辑:
const submitRepair = async () => {
try {
const submitData = {
// 构造提交数据
};
const response = await repairService(submitData);
// 处理响应
} catch (error) {
// 错误处理
}
}
学到的知识点:
- 表单数据绑定 (
v-model) - 表单验证规则
- 异步提交处理
- 错误处理和用户反馈
7. 分页与搜索
实现了带搜索条件的分页功能:
const getDeviceList = async () => {
let params = {
pageNum: pageNum.value,
pageSize: pageSize.value,
deviceType: selectedDeviceType.value,
deviceName: deviceName.value,
status: state.value
}
let result = await deviceListService(params);
// 更新数据
}
学到的知识点:
- 分页参数管理
- 搜索条件组合
- 分页组件事件处理
项目亮点
-
模块化设计:将 API 请求封装到单独的 service 文件中,便于维护和复用。
-
用户体验优化:
- 表单验证和错误提示
- 加载状态反馈
- 操作确认对话框
-
地图集成:实现了设备位置的直观选择。
-
Excel 导入导出:方便批量操作设备数据。
遇到的挑战与解决方案
-
地图异步加载问题:
- 使用
nextTick确保 DOM 加载完成后再初始化地图
- 使用
-
文件上传处理:
- 使用
FormData处理文件上传 - 实现文件类型和大小验证
- 使用
-
复杂表单状态管理:
- 使用
ref管理表单数据 - 实现表单重置功能
- 使用
总结
通过这个项目,我深入学习了 Vue 3 的组合式 API 和 Element Plus 组件库的使用,掌握了以下技能:
- Vue 3 响应式系统
- 复杂表单处理
- 第三方地图服务集成
- 文件上传下载
- 分页和搜索功能实现
- 组件间通信和状态管理
这些技术和知识点不仅适用于设备管理系统,也可以应用于其他类型的管理后台开发。未来可以考虑加入更多功能,如设备状态实时监控、维修历史记录等,进一步提升系统的实用性。
今日开发数据:
- 所花时间:1小时
- 代码量:约100行
- 博客量:1篇

浙公网安备 33010602011771号