news 2026/5/10 0:54:03

本地部署AI助手Catai:基于Llama.cpp的模型管理与服务集成指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
本地部署AI助手Catai:基于Llama.cpp的模型管理与服务集成指南

1. 项目概述:在本地运行你自己的AI助手

如果你和我一样,对大型语言模型(LLM)充满好奇,既想体验它们强大的对话和推理能力,又对数据隐私、网络依赖或API调用成本有所顾虑,那么本地部署一个AI模型可能是你一直在寻找的答案。今天要聊的Catai,就是一个能让你在个人电脑上轻松运行开源大语言模型的工具链。它不是一个全新的推理引擎,而是一个基于成熟技术(llama.cppnode-llama-cpp)构建的、对开发者极其友好的“封装器”和“管理平台”。

简单来说,Catai 做了两件核心事情:模型管理服务提供。它帮你处理了从网络下载GGUF格式模型文件、本地存储、到启动一个带有Web界面的聊天服务的所有繁琐步骤。你不需要去手动编译复杂的C++项目,也不用纠结于命令行参数,更不用自己写一个前端界面。通过几条简单的命令,你就能在浏览器里打开一个类似ChatGPT的聊天窗口,与你选择的模型进行对话。这对于想快速体验、测试不同模型,或者为自己开发的应用提供一个本地AI后端的开发者来说,吸引力巨大。

我最初接触它是因为需要一个稳定的、可编程的本地测试环境,来验证一些提示词(Prompt)工程的想法,而不想每次都去调用云端API。使用一段时间后,我发现它确实极大地简化了本地LLM的入门曲线。无论你是前端开发者、Node.js爱好者,还是任何对AI应用感兴趣的极客,只要你的电脑上安装了Node.js,就能在几分钟内让一个数亿甚至数十亿参数的模型跑起来。

2. 核心架构与工作原理拆解

要理解Catai为什么好用,我们需要先看看它底下依赖的技术栈,以及它是如何将这些组件优雅地整合在一起的。

2.1 技术栈基石:Llama.cpp 与 Node-Llama-Cpp

Catai 的核心能力并非凭空产生,它建立在两个非常关键的开源项目之上:

  1. Llama.cpp:这是一个用C/C++编写的高性能推理框架,由Georgi Gerganov开发。它的最大贡献是引入了GGML(现已演进为GGUF)这种二进制格式,专门为在消费级CPU(甚至部分GPU)上高效运行大模型而设计。通过一系列巧妙的量化技术(如Q4_K_M, Q8_0等),它能在保持模型能力基本不变的前提下,将模型体积和内存占用压缩数倍,使得在16GB甚至8GB内存的笔记本电脑上运行70亿参数(7B)的模型成为可能。Llama.cpp是当前本地大模型运行的“事实标准”。

  2. Node-Llama-Cpp:这是Catai团队自己维护的一个Node.js绑定库。你可以把它理解为一个“桥梁”或“胶水层”。它的作用是将底层C++写的Llama.cpp库的功能,通过Node.js的N-API暴露给JavaScript/TypeScript环境。这样,我们就能用熟悉的Node.js代码来加载模型、创建上下文、生成文本,而无需直接面对复杂的C++编译和链接过程。

Catai的角色:在上述基础上,Catai扮演了“产品经理”和“系统集成商”的角色。它利用Node-Llama-Cpp提供的底层能力,构建了一套完整的用户体验:

  • 命令行工具(CLI):用于模型的生命周期管理(安装、列表、切换、删除)。
  • 本地Web服务器:提供了一个开箱即用的聊天式Web界面(Chat UI)。
  • 开发API:暴露了更底层的编程接口,让开发者可以集成到自己的Node.js应用中。
  • 配置管理:统一管理模型路径、服务器端口等设置。

这种分层架构的好处是清晰且稳定。Catai专注于提升易用性和功能性,而将最核心、最耗性能的推理计算交给久经考验的Llama.cpp处理。

2.2 GGUF模型格式:效率的关键

在Catai的上下文中,你几乎只会接触到一种模型文件格式:.gguf。理解它有助于你更好地选择模型。

GGUF(GPT-Generated Unified Format)是GGML格式的下一代版本。它设计之初就考虑到了易用性和扩展性。一个GGUF文件里不仅包含了模型的所有权重参数,还内置了模型的架构信息、词汇表、量化类型等元数据。这意味着:

  • 自包含:一个文件包含运行所需的一切,无需额外的配置文件。
  • 量化支持:文件后缀(如q4_k_m,q8_0)直接指明了量化精度。q4_k_m表示4位量化,是精度和速度的较好平衡;q8_0是8位量化,精度损失更小但文件更大、速度稍慢。
  • 加载快:由于元数据前置,Llama.cpp可以快速读取文件头,了解模型结构,从而高效分配内存。

当你运行catai install qwen3-4b-q4_k_m时,工具会去Hugging Face等模型仓库寻找对应名称的GGUF文件。选择正确的量化版本是在你的硬件限制和模型效果之间取得平衡的关键。

2.3 Catai的工作流程

当你敲下catai up命令时,背后发生了一系列协同工作:

  1. 服务启动:Catai CLI启动一个基于Node.js的HTTP服务器(默认在127.0.0.1:3000)。
  2. 模型加载:服务器读取你的配置(或默认配置),找到当前激活的模型文件路径。
  3. 初始化推理引擎:通过Node-Llama-Cpp,调用已编译好的Llama.cpp本地库,将GGUF模型文件加载到内存中。
  4. 等待请求:Web服务器开始监听。你打开浏览器访问http://localhost:3000,前端页面被加载。
  5. 交互处理:你在前端输入问题并发送,前端通过WebSocket或HTTP POST请求将消息发送到后端服务器。
  6. 推理生成:后端服务器将你的提示词(Prompt)送入已加载的模型上下文,由Llama.cpp核心进行计算,并以流式(streaming)的方式将生成的token逐个返回给前端。
  7. 实时展示:前端实时接收到token流,并将其逐字渲染到聊天界面上,形成“打字机”效果。

整个过程,你的数据从未离开过你的电脑,这为隐私敏感型应用提供了坚实基础。

3. 从零开始:完整安装与配置指南

理论说得再多,不如动手一试。我们一步步来,确保你能顺利跑起来。

3.1 环境准备:Node.js是关键

Catai 是一个Node.js全局命令行工具,所以第一步是安装Node.js。这里有个关键点:请务必安装Current版本,而非LTS版本。这是因为底层的node-llama-cpp依赖的某些原生模块(Native Addons)可能需要较新的Node.js API或V8引擎特性。

  • 前往官网:访问 nodejs.org 。
  • 下载安装:点击页面中央突出的“Current”版本按钮进行下载和安装。对于Windows用户,安装程序会默认将Node和npm添加到系统路径。安装完成后,打开终端(Windows上是CMD或PowerShell,macOS/Linux是Terminal),验证安装:
    node --version npm --version
    你应该能看到类似v22.x.x10.x.x的版本号。

注意:如果你之前已经安装了LTS版本的Node.js,可以使用nvm(Node Version Manager)这类工具来管理多个Node版本,方便切换。对于大多数只想快速体验的用户,直接安装Current版本是最省事的。

3.2 安装Catai核心工具

环境就绪后,安装Catai本身非常简单,只需要一条命令:

npm install -g catai

-g参数代表全局安装,这会在你的系统路径下创建一个名为catai的可执行命令。

安装完成后,可以运行catai -V来查看版本号,确认安装成功。

3.3 下载你的第一个模型

Catai 本身不包含任何模型,你需要手动下载。它内置了从Hugging Face等开源模型仓库拉取模型的能力。让我们从一个较小但能力不错的模型开始,例如Qwen2.5的4B参数量化版:

catai install Qwen2.5-4B-Instruct-Q4_K_M

命令解析

  • install是安装命令。
  • Qwen2.5-4B-Instruct-Q4_K_M是模型标识符。Catai会尝试将这个名称解析为Hugging Face仓库Qwen/Qwen2.5-4B-Instruct-GGUF下的对应文件。

执行这个命令后,你会看到下载进度条。所有模型默认都会下载到~/catai目录下(在Windows上是C:\Users\<你的用户名>\catai)。这个目录是Catai的工作空间,里面会有一个models子文件夹用来存放所有GGUF文件。

这里有一个非常重要的实操心得:首次安装模型时,由于需要从海外仓库下载可能几个GB的文件,速度可能会很慢甚至失败。你可以考虑以下两种方案:

  1. 使用代理环境:在运行catai install前,在终端中配置临时代理(例如set HTTPS_PROXY=http://127.0.0.1:7890on Windows 或export HTTPS_PROXY=http://127.0.0.1:7890on macOS/Linux)。这能显著提升下载成功率。
  2. 手动下载后安装:如果你有更快的下载渠道(如国内镜像站),可以先手动下载好.gguf文件,然后使用Catai安装本地文件:
    catai install ./path/to/your/model-Q4_K_M.gguf -t my-model-name
    其中-t参数用于指定一个你自定义的、在Catai内部使用的模型名称。

3.4 启动聊天服务并访问

模型下载完成后,启动服务就一行命令:

catai up

默认情况下,它会启动服务器并自动在你的默认浏览器中打开http://localhost:3000。如果你需要指定端口或绑定地址,可以使用选项:

catai up --port 8080 --host 0.0.0.0 # 在8080端口启动,并允许局域网访问

现在,你就能在网页中和你的本地AI助手对话了。界面通常支持主题切换、对话历史管理等基础功能。

4. 核心CLI命令详解与高级用法

Catai的CLI是你管理本地模型生态的主要工具。掌握这些命令,你就能游刃有余。

4.1 模型生命周期管理

  • 列出所有可用/已安装模型

    catai models # 或简写 catai ls

    这个命令会列出两部分:1) 本地已安装的模型及其路径;2) 从远程仓库可获取的模型列表(这是一个预定义的列表,并非全网模型)。查看远程列表是发现新模型的好方法。

  • 安装指定模型

    catai install <model_identifier>

    模型标识符可以是:

    • 预定义列表中的名字(如Llama-3.2-3B-Instruct-Q4_K_M)。
    • Hugging Face仓库的模型文件直链URL。
    • 本地GGUF文件的路径。
  • 切换当前活动模型

    catai use Qwen2.5-4B-Instruct-Q4_K_M

    执行后,下次运行catai up时,服务将加载你指定的这个模型。你可以通过catai active查看当前激活的模型。

  • 删除已安装模型

    catai remove Qwen2.5-4B-Instruct-Q4_K_M # 或简写 catai rm Qwen2.5-4B-Instruct-Q4_K_M

    这会从~/catai/models目录中删除对应的GGUF文件,并更新内部索引。注意:此操作不可逆

  • 完全卸载

    catai uninstall

    这是一个危险命令。它会删除整个~/catai工作目录,包括所有已下载的模型和配置文件,并尝试卸载全局的Catai包。仅在你想彻底清理时使用。

4.2 服务管理与系统配置

  • 更新Catai服务器

    catai update

    这个命令会检查并更新Catai的服务器部分(即Web UI和后端API)到最新版本。它不会更新全局的CLI工具本身(那需要npm update -g catai),也不会更新已安装的模型。

  • 底层编译工具链管理

    catai node-llama-cpp --help

    这个命令组让你能直接与底层的node-llama-cpp交互,例如强制重新编译适用于你当前系统的本地二进制文件,这在升级Node.js版本或遇到链接库错误时非常有用。

4.3 配置文件的秘密

Catai的配置文件位于~/catai/config.json。虽然可以通过Web UI修改部分设置,但直接编辑配置文件能解锁更多选项。常见的配置项包括:

  • server.port: 服务器端口。
  • server.host: 绑定地址。
  • model: 默认加载的模型名称。
  • llama.cpp相关参数:如nGpuLayers(GPU加速层数)、contextSize(上下文长度)、batchSize等,这些直接影响推理性能和效果。

一个重要的性能调优技巧:如果你的电脑有独立GPU(NVIDIA),可以通过设置nGpuLayers将模型的部分层卸载到GPU上运行,能极大提升推理速度。这个值通常设为30-50,具体取决于你的GPU显存大小。你可以在Web UI的设置中调整,也可以直接修改配置文件。修改后需要重启catai up服务才能生效。

5. 开发者视角:深入API与集成应用

对于开发者而言,Catai的魅力远不止于一个聊天界面。它提供了两种层次的API,让你能将本地大模型的能力无缝集成到自己的Node.js应用中。

5.1 简易HTTP API

当你运行catai up后,一个本地API服务器就在后台运行了。这意味着你可以用任何能发送HTTP请求的工具(如curl、Postman、或另一个Node.js程序)来与模型交互。

最基本的聊天接口是一个POST请求:

curl -X POST http://localhost:3000/api/chat/prompt \ -H "Content-Type: application/json" \ -d '{"prompt": "用JavaScript写一个快速排序函数"}'

服务器会返回模型生成的完整文本响应。这对于自动化测试、脚本调用非常方便。

5.2 强大的开发API(编程接口)

这才是Catai为开发者准备的“主菜”。你可以在自己的Node.js/TypeScript项目中安装Catai作为依赖(npm install catai),然后直接调用其模块。

场景一:使用高级Chat会话

import { createChat, downloadModel, initCatAILlama, LlamaJsonSchemaGrammar } from "catai"; async function main() { // 1. 确保模型存在(如果已下载可跳过) await downloadModel("Qwen2.5-4B-Instruct-Q4_K_M"); // 2. 初始化底层Llama引擎 const llama = await initCatAILlama(); // 3. 创建聊天会话,指定模型 const chat = await createChat({ model: "Qwen2.5-4B-Instruct-Q4_K_M", temperature: 0.7, // 创造性,0-1,越高越随机 topP: 0.9, // 核采样,影响输出多样性 }); // 4. 发送提示词,并可指定输出格式(Grammar) const response = await chat.prompt("列举三种流行的前端框架,并简要说明其特点。"); console.log("AI回复:", response); // 5. 高级用法:使用JSON Schema Grammar强制模型返回结构化数据 const structuredResponse = await chat.prompt("生成5个编程相关的笑话。", { grammar: new LlamaJsonSchemaGrammar(llama, { type: "array", items: { type: "object", properties: { joke: { type: "string" }, category: { type: "string" } }, required: ["joke", "category"] } }), }); console.log("结构化笑话:", JSON.stringify(structuredResponse, null, 2)); // 输出将是严格的JSON数组,例如:[{"joke": "...", "category": "..."}, ...] } main().catch(console.error);

代码解读

  • createChat封装了完整的对话上下文管理,适合多轮对话。
  • LlamaJsonSchemaGrammar是一个杀手级功能。它利用Llama.cpp的“语法采样”特性,强制模型输出符合你定义的JSON Schema结构的数据。这对于构建需要稳定数据输出的AI应用(如自动数据提取、分类)至关重要,避免了模型“胡说八道”返回非JSON内容。

场景二:直接使用底层Node-Llama-Cpp如果你需要更精细的控制(如自定义上下文管理、更低的延迟),可以获取模型路径后直接使用node-llama-cpp的API。

import { getModelPath, initCatAILlama } from 'catai'; import { LlamaModel, LlamaContext, LlamaChatSession } from 'node-llama-cpp'; async function lowLevelDemo() { const modelName = "Qwen2.5-4B-Instruct-Q4_K_M"; // 获取Catai管理的模型绝对路径 const modelPath = getModelPath(modelName); const llama = await initCatAILlama(); // 直接加载模型,获得完全控制权 const model: LlamaModel = await llama.loadModel({ modelPath }); // 创建上下文,可以自定义上下文长度等参数 const context: LlamaContext = await model.createContext({ contextSize: 4096 // 设置上下文窗口大小 }); const session = new LlamaChatSession({ contextSequence: context.getSequence() }); // 进行多轮对话,上下文由自己管理 const answer1 = await session.prompt("你好,请介绍下你自己。"); console.log("第一轮:", answer1); // 第二轮对话会记住上一轮的内容 const answer2 = await session.prompt("基于你刚才的介绍,你擅长做什么?"); console.log("第二轮:", answer2); }

这种方式给你最大的灵活性,但也需要你手动处理上下文截断、会话历史等逻辑。

6. 性能调优、问题排查与实战心得

让一个本地大模型跑起来只是第一步,让它跑得“好”才是挑战。下面分享一些我踩过坑后总结的经验。

6.1 硬件要求与模型选择策略

你的硬件决定了你能玩转多大的模型。下面是一个粗略的参考表:

硬件配置推荐模型参数规模量化等级预期体验
8GB RAM(无GPU)1B-3BQ4_K_M速度较慢,适合简单问答,内存紧张。
16GB RAM(无GPU或入门GPU)4B-7BQ4_K_M基本流畅,可进行多轮对话和中等复杂度任务。
32GB RAM 或 8GB+显存GPU7B-14BQ4_K_M 或 Q8_0流畅,效果接近云端小模型,可编程调用。
64GB+ RAM 或 高端GPU20B+Q4_K_M能力强大,可处理复杂逻辑和长文本,接近ChatGPT 3.5水平。

选择模型的心得

  1. 从小的开始:先用一个3B或4B的模型(如Qwen2.5-4B)测试你的流水线,确保一切正常。
  2. 关注“Instruct”版本:选择名称中带有InstructChat的模型,这些模型经过对话微调,更擅长理解和遵循指令。
  3. 量化等级权衡q4_k_m是甜点,q8_0精度高但慢,q2_k体积最小但效果损失明显。除非硬件极其有限,否则不建议用q2_k
  4. 使用catai models命令:它会列出许多经过验证的、兼容性好的模型,比你自己去Hugging Face海选要靠谱。

6.2 常见错误与解决方案

  1. 安装失败:Failed to download model

    • 原因:网络连接问题,或模型标识符不存在于Catai的源列表。
    • 解决
      • 检查网络,尝试使用代理。
      • 使用完整的Hugging Face模型文件URL进行安装:catai install https://huggingface.co/.../model.gguf
      • 手动下载后从本地安装。
  2. 启动失败:Error: Cannot find module 'node-llama-cpp'Illegal instruction

    • 原因node-llama-cpp的原生二进制文件未正确编译或与当前系统不兼容。
    • 解决:运行catai node-llama-cpp rebuild强制重新编译。如果还不行,尝试降级Node.js到某个特定版本,或者查看项目的GitHub Issues寻找类似案例。
  3. 推理速度极慢或内存溢出(OOM)

    • 原因:模型太大,或上下文长度设置过高。
    • 解决
      • 换一个更小参数或更低量化的模型。
      • 在配置文件中减少contextSize(如从4096改为2048)。
      • 如果有NVIDIA GPU,在配置中增加nGpuLayers值(如40),将部分计算卸载到GPU。在Web UI的设置中通常可以找到这个选项。
  4. Web UI无法打开或连接失败

    • 原因:端口被占用,或防火墙阻止。
    • 解决
      • 使用catai up --port 另一个端口换一个端口。
      • 检查是否已有catai up进程在运行(ps aux | grep catai或任务管理器)。
      • 确保浏览器没有阻止localhost

6.3 高级配置与性能压榨

配置文件~/catai/config.json是你的调优中心。除了前面提到的nGpuLayers,还有几个关键参数:

  • threads: 设置推理使用的CPU线程数。默认可能为物理核心数。如果你的CPU核心很多,可以适当调高(如8或16),但并非线性增长,建议实测。
  • batchSize: 处理提示词时的批次大小。增加此值(如512)可能略微提升吞吐量,但也会增加内存使用。
  • contextSize:极其重要。它定义了模型能“记住”多长的对话历史。设得太小(如512),模型很快会忘记前文;设得太大(如8192),会消耗巨量内存且显著降低速度。根据你的对话长度需求合理设置,7B模型一般设为4096是一个平衡点。

一个实测技巧:在第一次使用新模型或新配置时,打开终端运行catai up,不要用--open参数让它自动打开浏览器。观察终端日志,看是否有警告或错误信息,同时可以看到加载模型各层和分配内存的详细过程,这对排查问题非常有帮助。

7. 生态、局限与未来展望

Catai 作为一个封装工具,其生态完全依赖于上游的llama.cpp和开源模型社区。它的最大优势是降低门槛,让不具备C++和深度学习部署知识的开发者也能快速上手本地AI。

当前的主要局限

  1. 性能天花板:最终性能取决于你的硬件和Llama.cpp的优化。在普通CPU上运行大模型,速度无法与云端GPU集群相比。
  2. 模型管理依赖社区catai models列表之外的模型需要手动通过URL安装,对模型版本的发现和更新支持不够自动化。
  3. 功能相对基础:相比于一些更成熟的本地AI套件(如Ollama、LM Studio),其在模型微调、高级RAG(检索增强生成)集成、多模态支持等方面功能还比较初级。

从项目动态来看,团队正在积极开发新UI函数调用(Function Calling)支持。函数调用将允许模型在对话中触发你预先定义好的工具函数(如查询天气、搜索数据库),这将是构建复杂AI Agent应用的基础能力,非常值得期待。

我个人在实际使用中的体会是,Catai最适合以下几类场景:

  • 快速原型验证:当你有一个AI应用的想法,需要快速验证提示词或流程时,用Catai本地搭建环境比申请API密钥和调试快得多。
  • 隐私敏感数据处理:处理公司内部文档、个人笔记等敏感信息时,数据不出本地是刚需。
  • 离线环境开发:在没有稳定网络的环境下进行开发或演示。
  • 学习与教学:理解大模型的工作原理、体验不同模型和参数的影响,没有比在本地直接运行更直观的方式了。

它可能不是功能最全的,但绝对是让开发者从零到一“跑起来”速度最快的工具之一。随着本地AI算力的普及和模型小型化技术的进步,像Catai这样的工具将会成为开发者工具箱中越来越常见的一员。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 0:53:12

AI系统设计实战指南:从RAG到Agentic Workflow的架构思维

1. 从面试焦虑到实战利器&#xff1a;我如何用一份开源指南攻克AI系统设计最近几年&#xff0c;AI领域的技术面试&#xff0c;尤其是针对高级岗位的系统设计轮&#xff0c;难度可以说是水涨船高。面试官不再满足于你背几个模型结构&#xff0c;或者调几个API。他们想看到的是&a…

作者头像 李华
网站建设 2026/5/10 0:51:57

Neovim集成AI插件llm.nvim:本地大模型编程助手实战指南

1. 项目概述&#xff1a;一个为Neovim注入AI灵魂的插件 如果你和我一样&#xff0c;是个常年泡在终端和编辑器里的开发者&#xff0c;那你肯定对Neovim不陌生。它强大、高效&#xff0c;但有时也显得有点“高冷”。当大语言模型&#xff08;LLM&#xff09;的浪潮席卷而来&…

作者头像 李华
网站建设 2026/5/10 0:51:14

Clawd-Code:基于LLM与代码库构建智能开发Agent的开源框架

1. 项目概述&#xff1a;从代码库到智能体的进化之路最近在开源社区里&#xff0c;一个名为“Clawd-Code”的项目引起了我的注意。它挂在GPT-AGI这个组织名下&#xff0c;名字本身就很有意思——“Clawd”听起来像是“Claw”&#xff08;爪子&#xff09;和“Cloud”&#xff0…

作者头像 李华
网站建设 2026/5/10 0:45:07

GoAmzAI:基于大语言模型的亚马逊卖家AI助手部署与应用实战

1. 项目概述&#xff1a;一个面向亚马逊卖家的AI助手工具最近在跨境电商圈子里&#xff0c;尤其是亚马逊卖家群体中&#xff0c;一个名为“GoAmzAI”的开源项目讨论度挺高。这个项目在GitHub上由开发者“Licoy”维护&#xff0c;定位是一个“Amazon Seller AI Assistant”&…

作者头像 李华
网站建设 2026/5/10 0:45:02

刚柔耦合机械臂动力学建模与模糊PD轨迹跟踪【附程序】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;假设模态-虚拟弹簧联合建模与加速度平滑多项式轨迹…

作者头像 李华
网站建设 2026/5/10 0:39:24

API 网关安全:全面防护策略

API 网关安全&#xff1a;全面防护策略 核心概念 API 网关作为微服务架构的入口&#xff0c;是安全防护的第一道防线。合理的安全配置可以有效保护后端服务&#xff0c;防止各种攻击。 请求认证 // JWT 认证过滤器 Component public class JwtAuthenticationFilter extends…

作者头像 李华