# 车辆管理 - 车牌号搜索功能修复
## 问题描述
用户反馈:**车辆管理页面的车牌号搜索功能不起作用**。
## 问题根源
### 错误的实现方式
在 `vehicle.vue` 中,`getDataList()` 方法**没有从 `baseSearch` 组件获取搜索参数**:
```javascript
// ❌ 错误:只使用 form 中的固定字段
const form = reactive({
pageNum: 1,
pageSize: 10,
licensePlate: '', // 这个字段永远是空字符串!
});
const getDataList = async () => {
const params = {
pageNum: form.pageNum,
pageSize: form.pageSize,
licensePlate: form.licensePlate, // ❌ 永远传空字符串
};
console.log('查询参数:', params);
const res = await vehicleList(params);
// ...
};
```
### 问题分析
1. **`form.licensePlate` 字段从未更新**
- 初始化为空字符串
- 用户在搜索框输入车牌号时,这个值不会改变
2. **没有使用 `baseSearchRef.value.penetrateParams()`**
- `baseSearch` 组件通过 `penetrateParams()` 方法返回用户输入的搜索参数
- 其他页面(如 `driver.vue`, `attestation.vue`)都正确使用了这个方法
- 但 `vehicle.vue` 没有调用它
3. **后端日志确认**
```
=== 查询车辆列表 ===
参数: {pageNum=1, pageSize=10, licensePlate=}
```
可以看到 `licensePlate` 确实是空的
## 解决方案
### 修改前后对比
#### 修改前(错误)
```javascript
const form = reactive({
pageNum: 1,
pageSize: 10,
licensePlate: '', // ❌ 多余的字段
});
const getDataList = async () => {
data.dataListLoading = true;
try {
const params = {
pageNum: form.pageNum,
pageSize: form.pageSize,
licensePlate: form.licensePlate, // ❌ 永远是空字符串
};
console.log('查询参数:', params);
// ...
}
};
```
#### 修改后(正确)
```javascript
const form = reactive({
pageNum: 1,
pageSize: 10,
// ✅ 移除 licensePlate 字段,改用 baseSearchRef 获取
});
const getDataList = async () => {
data.dataListLoading = true;
try {
// ✅ 使用 baseSearchRef 获取搜索参数
const params = {
...form,
...baseSearchRef.value.penetrateParams(),
};
console.log('[VEHICLE-SEARCH] 查询参数:', params);
// ...
}
};
```
### 关键改动点
1. **移除 `form.licensePlate` 字段**
- 不再在 `form` 中定义 `licensePlate`
- 避免与 `baseSearch` 组件的状态冲突
2. **使用 `baseSearchRef.value.penetrateParams()`**
- 这个方法会返回 `baseSearch` 组件中用户输入的所有搜索参数
- 返回格式:`{ licensePlate: '用户输入的车牌号' }`
3. **使用扩展运算符合并参数**
```javascript
const params = {
...form, // { pageNum: 1, pageSize: 10 }
...baseSearchRef.value.penetrateParams(), // { licensePlate: '鄂A 66662' }
};
// 结果: { pageNum: 1, pageSize: 10, licensePlate: '鄂A 66662' }
```
## 参考其他页面的正确实现
### driver.vue(司机管理)
```javascript
const form = reactive({
pageNum: 1,
pageSize: 10,
});
const getDataList = () => {
data.dataListLoading = true;
const params = {
...form,
...baseSearchRef.value.penetrateParams(), // ✅ 正确用法
};
// ...
};
```
### attestation.vue(入境检疫)
```javascript
const searchForm = reactive({
pageNum: 1,
pageSize: 10,
});
const getDataList = () => {
const params = {
...searchForm,
...baseSearchRef.value.penetrateParams(), // ✅ 正确用法
};
// ...
};
```
## baseSearch 组件工作原理
### 组件定义
```vue
```
### formItemList 配置
```javascript
const formItemList = reactive([
{
label: '车牌号',
param: 'licensePlate', // ← 参数名
type: 'input',
placeholder: '请输入车牌号',
span: 7,
labelWidth: 100,
},
]);
```
### penetrateParams() 返回值
当用户在搜索框输入 "鄂A 66662" 并点击搜索时:
```javascript
baseSearchRef.value.penetrateParams()
// 返回: { licensePlate: '鄂A 66662' }
```
## 测试步骤
### 1. 刷新浏览器
清除前端缓存,重新加载 `vehicle.vue` 组件。
### 2. 测试搜索功能
1. 进入"车辆管理"页面
2. 在车牌号搜索框输入:`鄂A 66662`
3. 点击"搜索"按钮
### 3. 查看控制台日志
```
[VEHICLE-SEARCH] 查询参数: { pageNum: 1, pageSize: 10, licensePlate: '鄂A 66662' }
```
### 4. 查看后端日志
```
=== 查询车辆列表 ===
参数: {pageNum=1, pageSize=10, licensePlate=鄂A 66662}
```
### 5. 验证搜索结果
- ✅ 表格应该只显示车牌号为 "鄂A 66662" 的车辆
- ✅ 如果没有匹配结果,显示"暂无数据"
## 常见问题排查
### Q1: 搜索框输入后点击搜索,表格没有变化?
**检查**:
1. 浏览器控制台是否有报错
2. 控制台日志中 `licensePlate` 的值是否正确
3. `baseSearchRef.value` 是否为 `null`(组件未正确引用)
### Q2: 后端收到的 licensePlate 还是空?
**可能原因**:
1. 前端代码没有正确保存(检查文件是否保存)
2. 浏览器缓存未清除(强制刷新:Ctrl+F5)
3. `baseSearch` 组件版本过旧(检查组件定义)
### Q3: 搜索时报错 "Cannot read property 'penetrateParams' of undefined"?
**原因**: `baseSearchRef.value` 为空
**解决**:
1. 确认组件引用正确:
```vue
```
2. 确认 ref 声明:
```javascript
const baseSearchRef = ref();
```
## 总结
✅ **问题已修复**:
- 使用 `baseSearchRef.value.penetrateParams()` 获取搜索参数
- 移除 `form.licensePlate` 避免状态冲突
- 增强日志便于排查问题
✅ **用户体验改善**:
- 车牌号搜索功能正常工作
- 支持模糊搜索(后端已实现 LIKE 查询)
- 搜索结果实时更新