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

Jeecg-Boot弹框选数据后,如何把关联表的其他信息也带回来?一个完整的前后端配置案例

Jeecg-Boot弹框选择数据后自动回填关联表信息的全链路实践

在业务系统开发中,弹框选择主表数据后自动带出关联表信息是高频需求场景。本文将以用户选择办理网点后自动填充城市、区县等关联信息为例,完整解析Jeecg-Boot框架下实现该功能的12个关键配置环节,涵盖从VO设计到前端回显的全流程技术细节。

1. 需求场景与技术方案设计

假设我们正在开发银行网点管理系统,当用户在"客户经理信息"页面通过弹框选择"所属网点"时,需要自动带出该网点对应的城市、区县、机构名称等关联信息。这类需求在CRM、ERP等系统中极为常见,其技术实现涉及三个核心问题:

  1. 数据关联关系:网点表(p_fixed_point)与网点类型表(p_fixed_point_itype)通过外键关联
  2. 数据传递路径:弹框选择值 → 后端关联查询 → 前端自动回填
  3. 框架适配:需遵循Jeecg-Boot的编码规范与数据流机制

解决方案采用多表关联查询+VO扩展字段的技术路线,相比单独接口查询具有更好性能。具体实现分为四个阶段:

  • 前端准备:配置弹框字段、扩展表单和表格字段
  • 后端改造:实体类扩展、多表查询实现
  • 数据绑定:字段映射与回显处理
  • 异常处理:空值处理与类型转换

2. 前端配置全流程

2.1 弹框选择器配置

在Online表单开发界面,设置网点字段为弹框选择模式:

// 在字段属性面板配置 { field: 'fixedPointItypeId', label: '办理网点', component: 'JPopup', componentProps: { field: 'id', // 实际存储值 orgFields: 'city,county,orgName,windows', // 需要带回的字段 destFields: 'city,county,orgName,windows', // 目标表单字段 dictTable: 'p_fixed_point_itype', // 关联表 dictText: 'windows', // 显示字段 dictCode: 'id' // 存储字段 } }

关键参数说明

参数说明示例值
orgFields源表字段city,county
destFields目标表单字段city,county
dictTable关联字典表p_fixed_point_itype
dictText显示字段windows
dictCode存储字段id

2.2 表单与表格字段扩展

UserInfoForm.vue中添加只读字段:

<a-col :span="12"> <a-form-item label="城市" name="city"> <a-input v-model:value="formData.city" placeholder="自动带出" :disabled="true" /> </a-form-item> </a-col> <a-col :span="12"> <a-form-item label="区县" name="county"> <a-input v-model:value="formData.county" placeholder="自动带出" :disabled="true" /> </a-form-item> </a-col>

UserInfo.data.ts中同步更新表格列定义:

// BasicColumn配置 { title: '城市', dataIndex: 'city', align: 'center', width: 120 }, { title: '区县', dataIndex: 'county', align: 'center', width: 120 }

注意:表单字段与表格字段需保持命名一致,避免出现大小写差异导致的数据绑定失败。

3. 后端实现关键步骤

3.1 实体类扩展

UserInfo.java中添加关联字段,使用@TableField(exist = false)标注非持久化字段:

@TableField(exist = false) @ApiModelProperty(value = "城市") private String city; @TableField(exist = false) @ApiModelProperty(value = "区县") private String county; @TableField(exist = false) @ApiModelProperty(value = "机构名称") private String orgName; @TableField(exist = false) @ApiModelProperty(value = "办理窗口") private String windows;

3.2 Mapper层多表查询

UserInfoMapper.xml中编写多表关联查询:

<select id="pageList" resultType="org.jeecg.modules.demo.entity.UserInfo"> SELECT u.*, p.city, p.county, p.org_name, i.windows FROM p_user_info u LEFT JOIN p_fixed_point_itype i ON u.fixed_point_itype_id = i.id LEFT JOIN p_fixed_point p ON i.fixed_point_id = p.id ${ew.customSqlSegment} </select>

3.3 Service层扩展

创建新的分页查询方法:

// IUserInfoService.java public interface IUserInfoService extends IService<UserInfo> { IPage<UserInfo> pageList(Page<UserInfo> page, QueryWrapper<UserInfo> queryWrapper); } // UserInfoServiceImpl.java @Override public IPage<UserInfo> pageList(Page<UserInfo> page, QueryWrapper<UserInfo> queryWrapper) { return userInfoMapper.pageList(page, queryWrapper); }

3.4 Controller层调用

修改原有列表接口:

@GetMapping(value = "/list") public Result<IPage<UserInfo>> queryPageList(UserInfo userInfo, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) { QueryWrapper<UserInfo> queryWrapper = QueryGenerator.initQueryWrapper(userInfo, req.getParameterMap()); Page<UserInfo> page = new Page<>(pageNo, pageSize); IPage<UserInfo> pageList = userInfoService.pageList(page, queryWrapper); return Result.OK(pageList); }

4. 常见问题与解决方案

4.1 数据回显异常处理

当数字类型字段无法正确回显时,需在前端进行类型转换:

// utils/xm_tools.js export function formData2String(formData) { if(!formData) return formData; Object.keys(formData).forEach(key => { if(typeof formData[key] === 'number') { formData[key] = String(formData[key]); } }); return formData; } // 在edit方法中调用 function edit(record) { nextTick(() => { resetFields(); Object.assign(formData, formData2String(record)); }); }

4.2 字段同步更新策略

为确保弹框选择后立即更新关联字段,需要在表单组件中添加监听:

watch(() => formData.fixedPointItypeId, (newVal) => { if(newVal) { // 调用接口获取关联数据 getLinkedInfo(newVal).then(res => { formData.city = res.city; formData.county = res.county; }); } });

4.3 性能优化建议

  1. 缓存策略:对网点基础信息使用Redis缓存
  2. 查询优化:为关联字段添加数据库索引
  3. 懒加载:非必要字段延迟加载
-- 添加索引示例 ALTER TABLE p_fixed_point ADD INDEX idx_city_county (city, county);

5. 扩展应用场景

本方案可应用于各类关联数据回填场景:

  1. 商品选择:选择商品后带出规格、单价
  2. 部门选择:选择部门后带出分管领导、办公地点
  3. 地址选择:选择省后联动加载市、区列表

实现模式对比:

方案优点缺点适用场景
多表查询一次请求完成SQL复杂度高关联表少(<3)
多次查询逻辑简单请求次数多关联层级深
本地缓存响应快数据一致性难保证静态数据

在实际项目中,根据数据更新频率和查询复杂度选择合适的实现方式。对于Jeecg-Boot项目,推荐优先采用本文的多表查询方案,既能利用框架特性,又能保证较好的性能表现。

http://www.cnnetsun.cn/news/2725019.html

相关文章:

  • XUnity.AutoTranslator终极指南:5步让外文游戏秒变中文
  • KeePass进阶玩法:巧用AutoTypeSearch插件,在远程桌面和虚拟机里也能一键输密码
  • 揭秘Windows右键菜单的底层逻辑:ContextMenuManager深度解析与技术实现
  • 构建高效技术情报系统:研究周报的生产流程与价值实现
  • 从Pikachu靶场通关看Web安全实战:一个新手如何用Burp Suite和PHPStudy复现所有漏洞(附完整Payload)
  • 除了超级马里奥,你还可以用Docker一键部署这些经典网页游戏(红白机模拟器合集)
  • ECG情绪识别避坑指南:WESAD和DREAMER数据集实战中的5个常见误区
  • 告别网盘限速:九大平台通用直链下载助手终极指南
  • AI建站工具选型指南:哪种方案最适合你的商用官网?
  • 纯Python手写BP网络拟合二元函数并生成3D对比曲面图
  • Claude Opus 4.8来了:Anthropic为何能在同一天“模型升级 + 估值反超OpenAI”?
  • 人大与北京智源打造的“赋格曲“式智能体协作系统
  • Android面试冲刺资料包:Java根基、组件原理、JVM机制与性能调优实战要点
  • 保姆级避坑指南:斐讯N1刷Armbian装CasaOS最全排错手册(从U盘启动失败到Cpolar隧道配置)
  • 计算机毕业设计之基于spark的电商零售交易数据分析系统的设计与实现
  • Windows下用Python调用海康SDK控制摄像头:登录、实时画面、截图和光学变倍
  • 告别鼠标拖拽:用Python脚本全自动控制Gazebo里的UR机械臂(MoveIt+ROS实战)
  • 杰理之清除TWS配对的功能(恢复出厂设置)【篇】
  • 浏览器脚本自动化革命:为什么ScriptCat是提升效率的终极选择?
  • STM32F103C8数控DC-DC电源完整开发包|含0.1V步进调压KEIL工程、全外设驱动源码与可烧录镜像
  • 交通预测的“ImageNet”来了?拆解LargeST数据集,看它如何解决模型泛化与时间分布外(OOD)挑战
  • 抄作业了!用ESP8266+BL0942做个能远程监控的智能插座(附完整代码和PCB文件)
  • 让 AI 拥有“岗前培训“——企业知识库 Skill 的四层知识 + 五步采集 + 30KB 阈值架构
  • 保姆级教程:在Ubuntu 22.04上从源码编译FLEXPART-WRF(含依赖库避坑指南)
  • 零基础掌握ncmdump:3分钟解锁网易云音乐NCM文件播放限制
  • 保姆级教程:用PyCharm+Python3.8一步步搞定TransUNet医学图像分割(附完整代码与数据集处理避坑指南)
  • 快速原型设计:基于快马ai生成vmware虚拟机集群搭建脚本
  • 乘客蓝牙名设为“BOMB”,美联航航班紧急返航,航空安全盲区引关注
  • 新手避坑:用Requests库爬中国大学MOOC时,这几个反爬和编码问题你遇到了吗?
  • RK3568开发板USB接口配置实战:从硬件引脚到设备树,手把手教你搞定USB Host与OTG