# 用户搜索 API 实现总结 ## ✅ 完成的工作 ### 1. 后端 API 实现 **文件**: `server/app/adminapi/controller/user/UserController.php` 新增 `search()` 方法: ```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 ]); } ``` ### 2. 前端 API 实现 **文件**: `admin/src/api/order.ts` 新增导出函数: ```typescript // 搜索用户/患者 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` - 账号 ### 响应数据 ```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 } } ``` ## 📊 对比旧方案 ### 旧方案(使用 /user.user/lists) ```typescript const res = await getUserList({ page_no: 1, page_size: 10, keyword: query }) ``` **问题**: - 需要获取完整用户列表 - 返回所有用户字段 - 性能较差 ### 新方案(使用 /user.user/search) ```typescript const res = await searchPatientsAPI({ keyword: query, page_no: 1, page_size: 10 }) ``` **优势**: - ✅ 专门为搜索优化 - ✅ 只返回必要字段 - ✅ 性能更好 - ✅ 支持多字段搜索 - ✅ 支持分页 ## 🎯 使用场景 ### 创建订单时搜索患者 在订单创建弹窗中,患者输入框使用远程搜索: ```vue ``` ### 搜索函数 ```typescript 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: ```bash # 搜索昵称为"张三"的用户 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 注入 - 受后端权限系统控制 - 只返回必要的用户信息 ## 📊 性能 - 支持分页,避免一次性加载大量数据 - 只返回必要字段 - 使用数据库索引优化查询 ## 🎓 示例 ### 搜索昵称 ```bash curl -X GET "http://localhost:8000/user.user/search?keyword=张三" \ -H "token: your_admin_token" ``` ### 搜索手机号 ```bash curl -X GET "http://localhost:8000/user.user/search?keyword=138" \ -H "token: your_admin_token" ``` ### 搜索账号 ```bash curl -X GET "http://localhost:8000/user.user/search?keyword=zhang" \ -H "token: your_admin_token" ``` --- **实现日期**: 2024-03-10 **版本**: 1.0.0 **状态**: ✅ 完成