NocoBase 审批通知渠道支持按标题远程搜索:大数据量配置不再靠翻页

2026-07-27 29 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

NocoBase 最新一周产品更新中,审批通知渠道新增了按标题远程搜索的能力。这个变化看似集中在一个选择框里,实际解决的是配置规模扩大后的核心问题:当通知渠道越来越多时,用户不必加载完整列表或逐页查找,可以直接输入标题,由服务端筛选候选项。

远程搜索改变了什么

普通下拉框通常在页面初始化时拉取全部选项,再由浏览器执行本地过滤。数据量较小时,这种方案简单有效;当通知渠道达到数百甚至数千条后,问题会逐渐显现:

  • 首次加载传输大量无关记录,拖慢审批配置页面。
  • 浏览器需要保存并过滤完整数据集。
  • 分页数据无法被前端完整搜索,用户仍需反复翻页。
  • 新增或修改的渠道可能因为本地缓存而不能立即出现。

远程搜索把过滤工作交给服务端。用户输入标题关键词后,前端只请求一小批匹配记录,例如最多返回 20 条。这样既降低了请求体积,也让搜索结果更接近数据库中的实时状态。

这项更新针对的是“按标题查找”,因此配置渠道标题时仍应保持可辨识性。与其使用大量“默认通知”或“审批提醒”,更适合采用“业务域 + 场景 + 渠道”的命名方式,例如:

采购审批 - 金额超限 - 企业微信
人事审批 - 入职完成 - 邮件
财务审批 - 报销驳回 - 短信

一个可落地的远程搜索接口模型

来源摘要没有公开该功能的具体接口路径和参数。下面是一个可以用于联调或改造的最小示例,假设前端通过 q 传递标题关键词,服务端返回 idtitle 两个字段。接入真实 NocoBase 项目时,需要根据当前版本的资源名称、权限规则和响应结构调整。

将以下代码保存为 server.py,它只使用 Python 标准库:

import json
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import parse_qs, urlparse

CHANNELS = [
    {"id": 1, "title": "采购审批 - 金额超限 - 企业微信"},
    {"id": 2, "title": "人事审批 - 入职完成 - 邮件"},
    {"id": 3, "title": "财务审批 - 报销驳回 - 短信"},
    {"id": 4, "title": "财务审批 - 付款完成 - 企业微信"},
]

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        request = urlparse(self.path)
        if request.path != "/api/notification-channels":
            self.send_error(404)
            return

        keyword = parse_qs(request.query).get("q", [""])[0].strip().lower()
        limit = 20
        matches = [
            channel for channel in CHANNELS
            if keyword in channel["title"].lower()
        ][:limit]

        payload = json.dumps(
            {"data": matches, "hasMore": False},
            ensure_ascii=False,
        ).encode("utf-8")

        self.send_response(200)
        self.send_header("Content-Type", "application/json; charset=utf-8")
        self.send_header("Content-Length", str(len(payload)))
        self.end_headers()
        self.wfile.write(payload)

if __name__ == "__main__":
    print("Listening on http://127.0.0.1:8000")
    HTTPServer(("127.0.0.1", 8000), Handler).serve_forever()

启动服务并搜索包含“财务”的渠道:

python3 server.py

在另一个终端执行:

curl --get 'http://127.0.0.1:8000/api/notification-channels' \
  --data-urlencode 'q=财务'

预期会得到两条匹配记录。生产接口还应加入鉴权、分页、租户或数据范围过滤,并限制单次返回数量。数据库侧可以先为标题列建立普通索引;如果需求升级为模糊搜索、分词搜索或多语言搜索,则需要结合所用数据库评估全文索引方案。

三个版本分支该怎么选

NocoBase 当前更新分为 mainnextdevelop 三个分支,它们代表不同的稳定性阶段:

  • main 是目前最稳定的版本,适合生产环境,也应作为大多数团队的默认选择。
  • next 包含即将发布并经过初步测试的功能,适合验证远程搜索等新能力,但仍可能存在已知或未知问题。
  • develop 面向持续开发,变化更快,不适合直接承载关键审批流程。

如果团队希望尽早验证这项功能,可以在隔离环境使用 next,导入脱敏后的通知渠道和审批配置,重点检查搜索准确性、权限隔离、请求延迟以及升级兼容性。生产环境则继续留在 main,等功能进入稳定发布后再按既有升级流程推进。

切换或升级前,可以先确认当前 Git 工作区所处分支:

git fetch --all --prune
git branch --show-current
git log -1 --oneline

如果采用容器镜像部署,应使用项目正式发布的明确版本标签,并记录镜像摘要;不要仅依赖会持续移动的分支标签。具体标签名称以团队实际使用的 NocoBase 发布方式为准。

上线前检查清单

远程搜索减少了加载量,但也把更多责任转移到了接口、数据库和权限系统。上线前建议确认以下事项:

  • 输入关键词后采用适当的防抖,避免每次按键都立即发起请求。
  • 空关键词只返回有限数量的常用项或最近使用项,不加载全部渠道。
  • 搜索接口复用原有数据权限,不能让用户看到无权配置的通知渠道。
  • 服务端设置明确的分页和数量上限,并处理超时、空结果和请求失败。
  • 标题命名具有业务辨识度,避免大量同名记录削弱搜索效果。
  • next 验证时保留回滚方案,不直接修改生产审批配置。

对通知渠道较少的实例,这项能力主要改善操作体验;对渠道数量大、多人维护或存在多业务域的实例,它会直接降低配置耗时。采用时不必为了追新而切换生产分支,更稳妥的路径是先在 next 完成真实数据规模下的验证,再等待稳定版本进入 main


相关推荐