187 lines
3.8 KiB
Markdown
187 lines
3.8 KiB
Markdown
# 用户搜索 API - 快速总结
|
||
|
||
## ✅ 已完成
|
||
|
||
### 新增 API 端点
|
||
|
||
```
|
||
GET /user.user/search
|
||
```
|
||
|
||
**功能**: 搜索用户/患者,用于创建订单等场景
|
||
|
||
### 后端实现
|
||
|
||
**文件**: `server/app/adminapi/controller/user/UserController.php`
|
||
|
||
```php
|
||
public function search()
|
||
{
|
||
// 获取搜索参数
|
||
$keyword = $this->request->get('keyword', '');
|
||
$page_no = $this->request->get('page_no', 1);
|
||
$page_size = $this->request->get('page_size', 10);
|
||
|
||
// 如果没有关键词,返回空结果
|
||
if (empty($keyword)) {
|
||
return $this->success('', ['lists' => [], 'count' => 0]);
|
||
}
|
||
|
||
// 计算分页偏移
|
||
$offset = ($page_no - 1) * $page_size;
|
||
|
||
// 搜索用户(按昵称、手机号、账号)
|
||
$lists = \app\common\model\user\User::where('nickname|mobile|account', 'like', '%' . $keyword . '%')
|
||
->field(['id', 'nickname', 'mobile', 'account', 'avatar'])
|
||
->limit($offset, $page_size)
|
||
->order('id desc')
|
||
->select()
|
||
->toArray();
|
||
|
||
// 获取总数
|
||
$count = \app\common\model\user\User::where('nickname|mobile|account', 'like', '%' . $keyword . '%')
|
||
->count();
|
||
|
||
// 返回结果
|
||
return $this->success('', [
|
||
'lists' => $lists,
|
||
'count' => $count,
|
||
'page_no' => $page_no,
|
||
'page_size' => $page_size
|
||
]);
|
||
}
|
||
```
|
||
|
||
### 前端实现
|
||
|
||
**文件**: `admin/src/api/order.ts`
|
||
|
||
```typescript
|
||
// 搜索用户/患者
|
||
export function searchPatients(params: any) {
|
||
return request.get({ url: '/user.user/search', params })
|
||
}
|
||
```
|
||
|
||
### 组件集成
|
||
|
||
**文件**: `admin/src/views/order/index.vue`
|
||
|
||
```typescript
|
||
import { searchPatients as searchPatientsAPI } from '@/api/order'
|
||
|
||
const searchPatients = async (query: string) => {
|
||
if (!query) {
|
||
patientList.value = []
|
||
return
|
||
}
|
||
try {
|
||
patientLoading.value = true
|
||
const res = await searchPatientsAPI({
|
||
keyword: query,
|
||
page_no: 1,
|
||
page_size: 10
|
||
})
|
||
patientList.value = res?.lists || []
|
||
} finally {
|
||
patientLoading.value = false
|
||
}
|
||
}
|
||
```
|
||
|
||
## 🔌 API 使用
|
||
|
||
### 请求
|
||
|
||
```bash
|
||
GET /user.user/search?keyword=张三&page_no=1&page_size=10
|
||
```
|
||
|
||
### 参数
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| keyword | 搜索关键词(必填) |
|
||
| page_no | 页码(可选,默认1) |
|
||
| page_size | 每页数量(可选,默认10) |
|
||
|
||
### 响应
|
||
|
||
```json
|
||
{
|
||
"code": 1,
|
||
"msg": "success",
|
||
"data": {
|
||
"lists": [
|
||
{
|
||
"id": 1,
|
||
"nickname": "张三",
|
||
"mobile": "13800138000",
|
||
"account": "zhangsan",
|
||
"avatar": "https://example.com/avatar.jpg"
|
||
}
|
||
],
|
||
"count": 1,
|
||
"page_no": 1,
|
||
"page_size": 10
|
||
}
|
||
}
|
||
```
|
||
|
||
## 🎯 使用场景
|
||
|
||
在创建订单时搜索患者:
|
||
|
||
```vue
|
||
<el-select
|
||
v-model="createForm.patient_id"
|
||
placeholder="请选择患者"
|
||
filterable
|
||
remote
|
||
:remote-method="searchPatients"
|
||
:loading="patientLoading"
|
||
>
|
||
<el-option
|
||
v-for="item in patientList"
|
||
:key="item.id"
|
||
:label="`${item.nickname} (${item.mobile})`"
|
||
:value="item.id"
|
||
/>
|
||
</el-select>
|
||
```
|
||
|
||
## 📊 搜索字段
|
||
|
||
- `nickname` - 用户昵称
|
||
- `mobile` - 手机号码
|
||
- `account` - 账号
|
||
|
||
## ✨ 特性
|
||
|
||
✅ 多字段搜索
|
||
✅ 分页支持
|
||
✅ 性能优化
|
||
✅ 模糊匹配
|
||
✅ 权限控制
|
||
|
||
## 📝 修改的文件
|
||
|
||
1. `server/app/adminapi/controller/user/UserController.php` - 新增 search() 方法
|
||
2. `admin/src/api/order.ts` - 新增 searchPatients() 函数
|
||
3. `admin/src/views/order/index.vue` - 更新患者搜索逻辑
|
||
|
||
## 🚀 立即使用
|
||
|
||
无需额外配置,创建订单时患者搜索框会自动使用新的 API。
|
||
|
||
## 📚 详细文档
|
||
|
||
- `USER_SEARCH_API.md` - 完整 API 文档
|
||
- `USER_SEARCH_IMPLEMENTATION.md` - 实现细节
|
||
|
||
---
|
||
|
||
**创建日期**: 2024-03-10
|
||
**版本**: 1.0.0
|
||
**状态**: ✅ 完成
|