Files
zyt/admin/USER_SEARCH_IMPLEMENTATION.md
T
2026-03-11 09:49:47 +08:00

5.4 KiB
Raw Blame History

用户搜索 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 状态: 完成