当前位置: 首页 > news >正文

若依分离版主从表开发实战:设备与传感器管理

1. 项目背景与需求解析

在企业管理系统中,设备与传感器的关联管理是一个经典的主从表业务场景。以若依分离版为基础进行二次开发时,如何优雅地实现这类关联关系,是每个开发者都会遇到的实战课题。我最近刚完成一个工业物联网平台的项目,其中就涉及到大量设备与传感器的绑定操作,这里分享下我的实现思路和踩坑经验。

主从表关系本质上是一对多的数据模型,比如一台PLC设备可以挂载多个温度传感器、压力传感器。在前端需要实现:

  • 设备列表展示(主表)
  • 点击设备可查看关联传感器(从表)
  • 支持传感器的新增、编辑、删除操作
  • 表单提交时的数据联动校验

2. 数据库设计要点

2.1 表结构设计

-- 设备表(主表) CREATE TABLE biz_device ( device_id BIGINT PRIMARY KEY, device_name VARCHAR(50) NOT NULL, device_code VARCHAR(30) UNIQUE, device_type VARCHAR(20), status CHAR(1) DEFAULT '0' ); -- 传感器表(从表) CREATE TABLE biz_sensor ( sensor_id BIGINT PRIMARY KEY, device_id BIGINT NOT NULL, sensor_name VARCHAR(50), sensor_type VARCHAR(20), measure_unit VARCHAR(10), FOREIGN KEY (device_id) REFERENCES biz_device(device_id) );

关键点:从表通过device_id关联主表,建立外键约束确保数据完整性

2.2 索引优化建议

  1. 为device_code添加唯一索引,避免设备编码重复
  2. 在biz_sensor表的device_id字段添加普通索引,加速关联查询
  3. 对于高频查询的status字段可考虑添加索引

3. 后端实现关键代码

3.1 MyBatis关联查询

<!-- 设备Mapper.xml --> <resultMap id="DeviceWithSensorsResult" type="Device"> <id property="deviceId" column="device_id"/> <result property="deviceName" column="device_name"/> <collection property="sensorList" ofType="Sensor"> <id property="sensorId" column="sensor_id"/> <result property="sensorName" column="sensor_name"/> </collection> </resultMap> <select id="selectDeviceWithSensors" resultMap="DeviceWithSensorsResult"> SELECT d.*, s.sensor_id, s.sensor_name FROM biz_device d LEFT JOIN biz_sensor s ON d.device_id = s.device_id WHERE d.device_id = #{deviceId} </select>

3.2 事务控制示例

@Transactional public void saveDeviceWithSensors(Device device) { // 1. 保存主表设备信息 deviceMapper.insertDevice(device); // 2. 批量保存从表传感器 if (device.getSensorList() != null) { device.getSensorList().forEach(sensor -> { sensor.setDeviceId(device.getDeviceId()); sensorMapper.insertSensor(sensor); }); } }

注意事项:务必添加@Transactional注解保证数据一致性

4. 前端Vue实现方案

4.1 设备列表页改造

在若依原有的crud.js基础上扩展:

// 在columns配置中添加操作列 { label: '传感器管理', key: 'sensor', width: 120, align: 'center', render: (h, { row }) => { return h('el-button', { props: { type: 'text', size: 'small' }, on: { click: () => this.handleSensor(row.deviceId) } }, '传感器') } }

4.2 传感器弹窗组件

<template> <el-dialog :visible.sync="visible"> <el-table :data="sensorData"> <el-table-column prop="sensorName" label="传感器名称"/> <el-table-column label="操作"> <template #default="{row}"> <el-button @click="handleEdit(row)">编辑</el-button> </template> </el-table-column> </el-table> <div style="margin-top: 20px"> <el-button @click="handleAdd">新增传感器</el-button> </div> </el-dialog> </template>

5. 常见问题与解决方案

5.1 表单联动校验问题

场景:需要确保传感器量程不超过设备允许范围

解决方案:

// 在传感器表单rules中添加自定义校验 rules: { maxRange: [ { validator: (rule, value, callback) => { if (value > this.device.maxRange) { callback(new Error('超过设备量程上限')); } else { callback(); } }} ] }

5.2 批量删除性能优化

当需要删除设备及其关联传感器时:

// 不推荐:循环单条删除 sensorList.forEach(sensor -> sensorMapper.deleteById(sensor.getId())); // 推荐:批量删除 sensorMapper.deleteByDeviceId(deviceId);

6. 扩展功能实现思路

6.1 导入导出增强

  1. 设备Excel导入时同步处理传感器数据
  2. 使用EasyExcel的监听器模式处理关联数据
  3. 导出时可选是否包含关联传感器信息

6.2 数据权限控制

在若依原有的@DataScope注解基础上扩展:

@DataScope(deptAlias = "d", userAlias = "u", sensorAlias = "s") public List<Device> selectDeviceList(Device device) { return mapper.selectDeviceList(device); }

7. 性能优化实践

7.1 N+1查询问题解决

原始方案可能存在的性能问题:

List<Device> devices = deviceMapper.selectList(); devices.forEach(device -> { List<Sensor> sensors = sensorMapper.selectByDeviceId(device.getId()); device.setSensors(sensors); });

优化方案:

  1. 使用MyBatis的collection一次查询(见3.1)
  2. 或使用@BatchSize注解实现延迟加载

7.2 缓存策略设计

@Cacheable(value = "device", key = "#deviceId") public Device getDeviceWithSensors(Long deviceId) { return deviceMapper.selectDeviceWithSensors(deviceId); } @CacheEvict(value = "device", key = "#deviceId") public void updateDevice(Device device) { deviceMapper.updateById(device); }

8. 实际开发中的经验总结

  1. 外键约束的双刃剑:

    • 开发环境建议开启外键约束,及早发现问题
    • 生产环境可考虑移除约束,通过程序保证一致性
  2. 前端分页处理技巧:

    • 主表分页查询使用若依自带分页
    • 从表数据建议使用前端分页(数据量不大时)
  3. 数据导入的避坑指南:

    • 先导入主表再导入从表
    • 使用事务保证原子性
    • 提供错误数据回滚机制
  4. 日志记录建议:

    • 记录主从表关联操作日志
    • 使用业务ID而非数据库ID作为关联标识

这个主从表开发模式可以扩展到各种关联业务场景,比如订单与订单项、问卷与问题等。关键在于理清业务边界,处理好事务一致性。我在实际项目中发现,合理的关联查询设计能减少30%以上的API调用次数。

http://www.jsqmd.com/news/1114242/

相关文章:

  • GEO优化五步法:提升AI推荐率的实战指南
  • 怀旧游戏集成方案:五款虚拟机模拟器实战部署与性能对比
  • BSCCompiler完全指南:华为统一编译器平台的10个核心功能详解
  • 目前2026年7月性价比最高的Coding Plan方案,适合经常使用DeepSeek和GLM大模型的开发者
  • 大模型API选型避坑指南:合规接入与真实评估方法
  • 软考中级报考避坑指南(2024版):信息系统运行管理员为何连续3年通过率超68.7%?
  • 防火防盗门膨胀密封条失效窜烟病害成因及改造修复技术
  • VisualCppRedist AIO:告别DLL缺失烦恼的Windows必备工具
  • 为什么90%零基础考生首选系统集成项目管理工程师?——基于近5年真题大数据的通过性深度拆解
  • 自建Agent框架:垂直领域AI开发实战指南
  • 神经网络架构图:用视觉化思维高效掌握深度学习模型
  • 维度灾难实战指南:识别高维稀疏性与距离失效的四大诊断法
  • 「零基础学 JS」JavaScript 入门(一):基础语法与浏览器执行机制
  • 神经网络架构可视化:从概念到实践的思维重构
  • 前端安全防御实战:从CSRF攻击原理到50种防御措施详解
  • 别再手动写@Test了!用这1个定制化Prompt+2个插件+1份断言规范,让ChatGPT产出符合SonarQube A级标准的测试代码
  • ComfyUI IPAdapter节点异常排查:从现象到根源的完整诊断流程
  • 2026年6月南大通用GBase 8c数据库认证培训圆满结束
  • 别再瞎找了!盘点2026年全民喜爱的AI论文写作软件
  • 5分钟解锁Wallpaper Engine壁纸资源:RePKG带你轻松提取和转换
  • 终极指南:如何使用applera1n工具绕过iOS 15-16设备激活锁
  • 软考中项/高项 vs 阿里云ACA/ACP:4张能力雷达图+6个典型岗位JD匹配度对比,这份稀缺决策矩阵仅限本周开放下载
  • JMeter扩展SSE流式接口自动化测试:从协议原理到工程实践
  • 新能源电池研发管理用哪家PLM?2026年国内外软件分类与选型要点一览
  • 深度解析ComfyUI IPAdapter Plus依赖冲突:从InsightFace安装失败到二进制兼容性修复
  • 构建高效手机号码定位系统:智能查询工具完全指南
  • 【紧急预警】2024年起软考高项论文题型重构+PMP新版考试权重调整——现在不决策,下半年将多花6个月+2.3万元试错成本
  • Spring Boot实战:从零构建冷链监控平台温控系统毕业设计
  • SpringBoot3+ShardingSphere实现高性能分库分表实战
  • “癌王”胰腺癌生物标志物研究进展与全景梳理