5.4 KiB
5.4 KiB
用户搜索 API 实现总结
✅ 完成的工作
1. 后端 API 实现
文件: server/app/adminapi/controller/user/UserController.php
新增 search() 方法:
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
]);
}
2. 前端 API 实现
文件: admin/src/api/order.ts
新增导出函数:
// 搜索用户/患者
export function searchPatients(params: any) {
return request.get({ url: '/user.user/search', params })
}
3. 前端组件更新
文件: admin/src/views/order/index.vue
- 导入新的 API 函数
- 更新患者搜索逻辑
- 使用新的搜索端点
🔌 API 端点
GET /user.user/search
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | string | 是 | 搜索关键词 |
| page_no | int | 否 | 页码(默认1) |
| page_size | int | 否 | 每页数量(默认10) |
搜索字段
nickname- 用户昵称mobile- 手机号码account- 账号
响应数据
{
"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
}
}
📊 对比旧方案
旧方案(使用 /user.user/lists)
const res = await getUserList({
page_no: 1,
page_size: 10,
keyword: query
})
问题:
- 需要获取完整用户列表
- 返回所有用户字段
- 性能较差
新方案(使用 /user.user/search)
const res = await searchPatientsAPI({
keyword: query,
page_no: 1,
page_size: 10
})
优势:
- ✅ 专门为搜索优化
- ✅ 只返回必要字段
- ✅ 性能更好
- ✅ 支持多字段搜索
- ✅ 支持分页
🎯 使用场景
创建订单时搜索患者
在订单创建弹窗中,患者输入框使用远程搜索:
<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>
搜索函数
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
}
}
📝 修改的文件
后端
server/app/adminapi/controller/user/UserController.php- 新增 search() 方法
前端
admin/src/api/order.ts- 新增 searchPatients() 函数admin/src/views/order/index.vue- 更新患者搜索逻辑
🚀 快速开始
1. 后端已实现
search() 方法已添加到 UserController,无需额外配置。
2. 前端已集成
订单创建弹窗已使用新的搜索 API。
3. 立即使用
在创建订单时,患者搜索框会自动使用新的 API:
# 搜索昵称为"张三"的用户
GET /user.user/search?keyword=张三&page_no=1&page_size=10
📚 相关文档
USER_SEARCH_API.md- 详细 API 文档CREATE_ORDER_FEATURE.md- 创建订单功能说明admin/src/views/order/index.vue- 订单列表页面
✨ 特性
✅ 多字段搜索 - 支持按昵称、手机号、账号搜索 ✅ 分页支持 - 支持分页查询 ✅ 性能优化 - 只返回必要字段 ✅ 模糊匹配 - 支持模糊搜索 ✅ 排序 - 按 ID 倒序排列 ✅ 权限控制 - 受后端权限系统控制
🔒 安全性
- 使用参数化查询防止 SQL 注入
- 受后端权限系统控制
- 只返回必要的用户信息
📊 性能
- 支持分页,避免一次性加载大量数据
- 只返回必要字段
- 使用数据库索引优化查询
🎓 示例
搜索昵称
curl -X GET "http://localhost:8000/user.user/search?keyword=张三" \
-H "token: your_admin_token"
搜索手机号
curl -X GET "http://localhost:8000/user.user/search?keyword=138" \
-H "token: your_admin_token"
搜索账号
curl -X GET "http://localhost:8000/user.user/search?keyword=zhang" \
-H "token: your_admin_token"
实现日期: 2024-03-10 版本: 1.0.0 状态: ✅ 完成