# 用户搜索 API 文档 ## 概述 新增了用户/患者搜索 API 端点,用于在创建订单等场景中快速搜索用户。 ## API 端点 ### 搜索用户 **请求** ``` GET /user.user/search ``` **参数** ```json { "keyword": "张三", // 搜索关键词(必填) "page_no": 1, // 页码(可选,默认1) "page_size": 10 // 每页数量(可选,默认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 } } ``` ## 实现细节 ### 后端实现 **文件**: `server/app/adminapi/controller/user/UserController.php` ```php /** * @notes 搜索用户(用于创建订单等场景) * @return \think\response\Json */ 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 }) } ``` **使用示例**: ```typescript import { searchPatients } from '@/api/order' const res = await searchPatients({ keyword: '张三', page_no: 1, page_size: 10 }) ``` ## 使用场景 ### 1. 创建订单时搜索患者 在订单创建弹窗中,患者输入框使用远程搜索: ```vue ``` ### 2. 组件中的使用 ```typescript const patientLoading = ref(false) const patientList = ref([]) 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 } } ``` ## 特性 ✅ **多字段搜索** - 支持按昵称、手机号、账号搜索 ✅ **分页支持** - 支持分页查询 ✅ **性能优化** - 只返回必要字段 ✅ **模糊匹配** - 支持模糊搜索 ✅ **排序** - 按 ID 倒序排列 ## 返回字段说明 | 字段 | 类型 | 说明 | |------|------|------| | id | int | 用户ID | | nickname | string | 用户昵称 | | mobile | string | 手机号码 | | account | string | 账号 | | avatar | string | 头像URL | ## 权限 此 API 端点需要管理员权限,受后端权限系统控制。 ## 对比旧方案 ### 旧方案 - 使用 `/user.user/lists` 获取完整用户列表 - 需要获取所有用户数据 - 性能较差 ### 新方案 - 使用 `/user.user/search` 搜索用户 - 只返回匹配的用户 - 支持分页 - 性能更好 ## 相关文件 - `server/app/adminapi/controller/user/UserController.php` - 后端控制器(已更新) - `admin/src/api/order.ts` - 前端 API(已更新) - `admin/src/views/order/index.vue` - 订单列表页面(已更新) ## 示例请求 ### 搜索昵称为"张三"的用户 ```bash curl -X GET "http://localhost:8000/user.user/search?keyword=张三&page_no=1&page_size=10" \ -H "token: your_admin_token" ``` ### 搜索手机号为"138"开头的用户 ```bash curl -X GET "http://localhost:8000/user.user/search?keyword=138&page_no=1&page_size=10" \ -H "token: your_admin_token" ``` ### 搜索账号为"zhang"的用户 ```bash curl -X GET "http://localhost:8000/user.user/search?keyword=zhang&page_no=1&page_size=10" \ -H "token: your_admin_token" ``` ## 响应示例 ### 成功响应 ```json { "code": 1, "msg": "success", "data": { "lists": [ { "id": 1, "nickname": "张三", "mobile": "13800138000", "account": "zhangsan", "avatar": "https://example.com/avatar.jpg" }, { "id": 2, "nickname": "张四", "mobile": "13800138001", "account": "zhangsi", "avatar": "https://example.com/avatar2.jpg" } ], "count": 2, "page_no": 1, "page_size": 10 } } ``` ### 空结果响应 ```json { "code": 1, "msg": "success", "data": { "lists": [], "count": 0, "page_no": 1, "page_size": 10 } } ``` ### 无关键词响应 ```json { "code": 1, "msg": "success", "data": { "lists": [], "count": 0 } } ``` ## 注意事项 1. **关键词必填** - 必须提供搜索关键词,否则返回空列表 2. **最少一个字符** - 建议在用户输入至少一个字符后才发起搜索 3. **分页参数** - page_no 和 page_size 为可选参数,有默认值 4. **性能考虑** - 搜索结果默认返回 10 条,可根据需要调整 page_size --- **创建日期**: 2024-03-10 **版本**: 1.0.0 **状态**: ✅ 完成