在急救转运任务创建页面中,医院选择功能需要优化用户体验:
1. 初始状态下显示前100条医院数据,方便用户快速选择常用医院
2. 只有在用户输入搜索关键词后才去服务端搜索,减少不必要的请求
文件: app/pages/task/create-emergency.vue
新增数据字段:javascript data() { return { // ... 其他字段 defaultHospitals: [], // 默认的100条医院数据 } }
在 onLoad 生命周期中调用:javascript onLoad(options) { // ... 其他初始化代码 // 加载默认医院列表(前100条) this.loadDefaultHospitals() }
// 加载默认医院列表(前100条)
loadDefaultHospitals() {
// 传入空字符串获取前100条
searchHospitals('').then(response => {
this.defaultHospitals = response.data || []
// 同时初始化两个搜索结果为默认数据
this.hospitalOutResults = [...this.defaultHospitals]
this.hospitalInResults = [...this.defaultHospitals]
}).catch(error => {
console.error('加载默认医院列表失败:', error)
this.defaultHospitals = []
})
}
转出医院:javascript // 转出医院输入框获得焦点 onHospitalOutFocus() { // 如果没有搜索关键词,显示默认的100条数据 if (!this.hospitalOutSearchKeyword || this.hospitalOutSearchKeyword.trim() === '') { this.hospitalOutResults = [...this.defaultHospitals] } this.showHospitalOutResults = true }
转入医院:javascript // 转入医院输入框获得焦点 onHospitalInFocus() { // 如果没有搜索关键词,显示默认的100条数据 if (!this.hospitalInSearchKeyword || this.hospitalInSearchKeyword.trim() === '') { this.hospitalInResults = [...this.defaultHospitals] } this.showHospitalInResults = true }
转出医院搜索:
```javascript
// 转出医院搜索
onHospitalOutSearch(e) {
const keyword = e.detail.value
this.hospitalOutSearchKeyword = keyword
// 防抖处理
if (this.searchTimer) {
clearTimeout(this.searchTimer)
}
// 如果关键词为空,显示默认100条
if (!keyword || keyword.trim() === '') {
this.hospitalOutResults = [...this.defaultHospitals]
this.showHospitalOutResults = true
return
}
// 有关键词时,去服务端搜索
this.searchTimer = setTimeout(() => {
this.searchHospitalOut(keyword)
}, 300)
}
```
转入医院搜索:
```javascript
// 转入医院搜索
onHospitalInSearch(e) {
const keyword = e.detail.value
this.hospitalInSearchKeyword = keyword
// 防抖处理
if (this.searchTimer) {
clearTimeout(this.searchTimer)
}
// 如果关键词为空,显示默认100条
if (!keyword || keyword.trim() === '') {
this.hospitalInResults = [...this.defaultHospitals]
this.showHospitalInResults = true
return
}
// 有关键词时,去服务端搜索
this.searchTimer = setTimeout(() => {
this.searchHospitalIn(keyword)
}, 300)
}
```
转出医院输入框:html <input class="form-input" placeholder="请输入医院名称或地址搜索" v-model="hospitalOutSearchKeyword" @input="onHospitalOutSearch" @focus="onHospitalOutFocus" />
转入医院输入框:html <input class="form-input" placeholder="请输入医院名称或地址搜索" v-model="hospitalInSearchKeyword" @input="onHospitalInSearch" @focus="onHospitalInFocus" />
文件: ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml
将 TOP 50 修改为 TOP 100:xml <select id="searchHospitals" parameterType="String" resultMap="HospDataResult"> SELECT TOP 100 HospID, HospName, HospCityID, HospShort, HopsProvince, HopsCity, HopsArea, HospAddress, HospTEL, HospUnitID, HospState, HospOAID, HospIntroducerID, HospIntroducerDate, HospLevel FROM HospData WHERE 1=1 <if test="keyword != null and keyword != ''"> AND (HospName LIKE '%' + #{keyword} + '%' OR HospAddress LIKE '%' + #{keyword} + '%' OR HospShort LIKE '%' + #{keyword} + '%') </if> AND (HospState IS NULL OR HospState = 1) ORDER BY HospName </select>
页面加载 (onLoad)
↓
调用 loadDefaultHospitals()
↓
请求后端 searchHospitals('')
↓
获取前100条医院数据
↓
保存到 defaultHospitals
↓
同时初始化 hospitalOutResults 和 hospitalInResults
用户点击输入框
↓
触发 @focus 事件
↓
调用 onHospitalOutFocus 或 onHospitalInFocus
↓
检查是否有搜索关键词
↓
【无关键词】显示默认100条数据
【有关键词】保持当前搜索结果
↓
显示下拉列表
用户输入关键词
↓
触发 @input 事件
↓
调用 onHospitalOutSearch 或 onHospitalInSearch
↓
【关键词为空】显示默认100条数据
【关键词不为空】防抖300ms后请求服务端搜索
↓
更新搜索结果列表
↓
显示下拉列表
@DataSource(DataSourceType.SQLSERVER) 注解,查询SQL Server数据库TOP 100 和 LIKE '%' + #{keyword} + '%'[...this.defaultHospitals] 进行数组拷贝,避免引用问题app/pages/task/create-emergency.vue - 急救转运任务创建页面app/api/hospital.js - 医院API接口ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/HospDataController.java - 医院控制器ruoyi-system/src/main/java/com/ruoyi/system/mapper/HospDataMapper.java - 医院Mapper接口ruoyi-system/src/main/resources/mapper/system/HospDataMapper.xml - 医院Mapper XMLruoyi-system/src/main/java/com/ruoyi/system/domain/HospData.java - 医院实体类