排期明细提交时前后端参数传递处理方法
一、基础参数传递流程
1.1 前端Vue组件定义
export default {
data() {
return {
queryParams: {
productName: '',
requirementId: '',
domainePerson: '',
reqState:'',
},
}
}
}
1.2 请求发送方法
methods: {
[CRUD.HOOK.beforeRefresh]() {
// 构建符合后端接收格式的扁平化参数
const params = {
productName: this.queryParams.productName || undefined,
domainePerson: this.queryParams.domainePerson || undefined,
requirementId: this.queryParams.requirementId || undefined,
reqState: this.queryParams.reqState || undefined,
...this.crud.page
}
Object.keys(params).forEach(key => {
if (params[key] === undefined || params[key] === '') {
delete params[key]
}
})
this.crud.params = params
return true
}
}
二、后端Controller接收
2.1 基础接收方式
@GetMapping("/api/schedules")
public ResponseEntity<PageResult<Schedule>> querySchedules(
@RequestParam(required = false) String productName,
@RequestParam(required = false) String domainePerson,
@RequestParam(required = false) String requirementId,
@RequestParam(required = false) Integer reqState,
Page<Object> page) {
ScheduleQueryCriteria criteria = new ScheduleQueryCriteria();
Schedule schedule = new Schedule();
schedule.setProductName(productName);
schedule.setDomainePerson(domainePerson);
if(reqState!=null)
{ schedule.setReqState(reqState);}
if(requirementId!=null) {
schedule.setRequirementId(Long.parseLong(requirementId));
}
criteria.setSchedule(schedule);
return new ResponseEntity<>(scheduleService.queryAll(criteria, page), HttpStatus.OK);
}
三、MyBatis处理参数
3.1 Mapper接口定义
@Mapper
public interface ScheduleMapper extends BaseMapper<Schedule> {
IPage<Schedule> queryAll(@Param("criteria") ScheduleQueryCriteria criteria, Page<Object> page);
}
3.2 XML映射配置
<select id="queryAll" resultMap="BaseResultMap">
select
s.schedule_id,
s.version_number,
s.people_involved,
s.recipients,
s.comment,
s.product_name AS productName,
s.requirement_id AS requirementId,
r.req_name AS requirementName,
r.req_state AS reqState,
s.domaine_person AS domainePerson,
s.online_date AS onlineDate
from mnt_schedule s
LEFT JOIN
mnt_requirement r ON s.requirement_id = r.req_id
<where>
<if test="criteria != null">
<if test="criteria.schedule.productName!= null">
and s.product_name = #{criteria.schedule.productName}
</if>
<if test="criteria.schedule.domainePerson!= null">
and s.domaine_person = #{criteria.schedule.domainePerson}
</if>
<if test="criteria.schedule.requirementId!= null">
and s.requirement_id = #{criteria.schedule.requirementId}
</if>
<if test="criteria.schedule.reqState!= null">
and r.req_state = #{criteria.schedule.reqState}
</if>
</if>
</where>
ORDER BY r.req_state ASC, s.schedule_id DESC
</select>
四、参数处理规范
| 前端传参格式 | 后端接收方式 | MyBatis处理方式 |
|---|---|---|
?productName=测试 |
@RequestParam String productName |
#{productName} |
?id=1,2,3 |
@RequestParam List<Long> ids |
<foreach collection="ids"> |
| 无参数 | 不声明参数 | 无条件查询 |
五、调试与验证
5.1 前端调试方法
// 打印实际请求URL
console.log('请求参数:', this.$axios.getUri({ params }))
5.2 后端日志配置
logging:
level:
com.example.mapper: DEBUG
5.3 常见问题排查
-
参数未接收到
- 检查URL参数名与
@RequestParam名称是否一致 - 验证参数是否被URL编码
- 检查URL参数名与
-
SQL执行异常
- 检查MyBatis日志中的完整SQL
- 验证表字段名与实体类映射关系
-
空值处理问题
- 前端过滤空字符串参数
- 后端使用
required = false
六、最佳实践建议
-
命名规范
- 保持前后端参数命名一致(推荐全小写+下划线)
- 数据库字段与实体类属性明确映射
-
参数处理
- 字符串参数统一trim处理
- 数值型参数做范围校验
- 敏感字段需要脱敏
-
代码风格
- 简单查询直接使用基本参数
- 超过3个参数建议使用对象封装
- 保持Mapper接口与XML的对应关系清晰

浙公网安备 33010602011771号