更新
This commit is contained in:
@@ -0,0 +1,269 @@
|
||||
# 用户搜索 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
|
||||
<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>
|
||||
```
|
||||
|
||||
### 搜索函数
|
||||
|
||||
```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
|
||||
**状态**: ✅ 完成
|
||||
Reference in New Issue
Block a user