koa-jwt 使用文档

Node.js 搭建一个 API 接口服务(实战) 前言 因为最近打算自己搭建一个自己的博客系统,用来记录日常的学习和提升一下写作水平,所以能就打算自己搭建一下前后端项目。在网上找了下,也没有找到合适(现成)的项目,所以就打算自己动手来搭建一下。这篇文章主要描述如何搭建一个node的API接口服务。 技术栈简述 网上的node框架也挺多的,用的较多的有egg,express,koa等框架,框架间各有利弊,最后均衡下来,还是决定使用可拓展性比较强的koa2来搭建项目,加上最近在学习typescript,最后决定使用的技术栈就是 koa+typescript+m 阅读详情

koa-jwt 使用文档

概述

koa-jwt 是一个用于在 Koa.js 应用中通过 JSON Web Tokens (JWT) 进行 HTTP 请求认证的中间件。

版本要求

Koa 版本Node 版本应使用的 koa-jwt 版本
koa 2+< 7.6koa-jwt@2
koa 2+≥ 7.6koa-jwt@3+(master 分支)
koa 1任意koa-jwt@1

安装

npm install koa-jwt

基本用法

基础配置示例

const Koa = require('koa');
const jwt = require('koa-jwt');

const app = new Koa();

// 自定义 401 错误处理
app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    if (err.status === 401) {
      ctx.status = 401;
      ctx.body = 'Protected resource, use Authorization header to get access\n';
    } else {
      throw err;
    }
  }
});

// 公共路由(无需认证)
app.use(async (ctx, next) => {
  if (ctx.url.match(/^\/public/)) {
    ctx.body = 'unprotected\n';
  } else {
    await next();
  }
});

// JWT 认证中间件(从此以下的中间件需要有效 JWT)
app.use(jwt({ secret: 'shared-secret' }));

// 受保护的路由
app.use(async (ctx) => {
  if (ctx.url.match(/^\/api/)) {
    ctx.body = 'protected\n';
  }
});

app.listen(3000);

使用 unless 排除特定路径

const Koa = require('koa');
const jwt = require('koa-jwt');

const app = new Koa();

// 使用 unless 排除特定路径
app.use(jwt({ secret: 'shared-secret' }).unless({ path: [/^\/public/] }));

app.listen(3000);

配置选项

主要配置项

选项类型默认值说明
secretString/Array/Function/Buffer必填加密密钥(支持数组、函数、公钥)
keyString‘user’存储解码数据的 ctx.state 属性名
getTokenFunctionundefined自定义获取 token 的函数
isRevokedFunctionundefined检查 token 是否被吊销的函数
passthroughBooleanfalse是否始终调用 next()
cookieStringundefined从 cookie 获取 token 的字段名
audienceStringundefined验证受众
issuerStringundefined验证签发者
debugBooleanfalse是否开启调试模式
tokenKeyStringundefined存储原始 token 的 ctx.state 属性名

Token 获取顺序

  1. opts.getToken 函数(如果提供)
  2. Cookie(如果 opts.cookie 设置)
  3. Authorization 头部(Bearer token)

高级功能

自定义 Token 获取函数

app.use(jwt({
  secret: 'shared-secret',
  getToken: function(opts) {
    // 自定义获取 token 的逻辑
    // this 指向 ctx 对象
    return this.get('x-custom-token');
  }
}));
getToken 函数接口
/**
 * 自定义 token 解析器
 * @this 传递给中间件的 ctx 对象
 * @param  {Object} opts 中间件的选项
 * @return {String|null} 解析到的 token 或 null(如果未找到)
 */

检查 Token 是否吊销

app.use(jwt({
  secret: 'shared-secret',
  isRevoked: async (ctx, decodedToken, token) => {
    // 检查 token 是否被吊销
    const isRevoked = await checkTokenRevocation(token);
    // 如果 token 未被吊销,必须返回 false,否则返回 true
    return isRevoked;
  }
}));
isRevoked 函数接口
/**
 * 自定义 isRevoked 解析器
 * @param  {object} ctx          传递给中间件的 ctx 对象
 * @param  {object} decodedToken Token 的内容
 * @param  {object} token        token 字符串
 * @return {Promise}             如果 token 未被吊销,promise 必须 resolve false,
 *                               否则(promise resolve true 或出错)token 被视为吊销
 */

使用多个密钥

// 支持密钥轮换
app.use(jwt({ 
  secret: ['old-shared-secret', 'new-shared-secret'] 
}));

使用公钥/私钥

const fs = require('fs');
const publicKey = fs.readFileSync('/path/to/public.pub');

app.use(jwt({ secret: publicKey }));

动态密钥函数

app.use(jwt({
  secret: (header, payload) => {
    // 根据 header 和 payload 返回密钥
    // 例如,根据 key id (kid) 获取对应的密钥
    return Promise.resolve(getSecretBasedOnKid(header.kid));
  }
}));

使用 JWKS(JSON Web Key Set)

const { koaJwtSecret } = require('jwks-rsa');

app.use(jwt({ 
  secret: koaJwtSecret({
    jwksUri: 'https://your-domain/.well-known/jwks.json',
    cache: true,
    cacheMaxEntries: 5,
    cacheMaxAge: 600000 // 10分钟
  }),
  audience: 'http://myapi/protected',
  issuer: 'http://your-issuer' 
}));

数据访问

默认访问方式

认证成功后,解码的数据存储在 ctx.state.user:

app.use(jwt({ secret: 'shared-secret' }));

app.use(async (ctx) => {
  console.log(ctx.state.user); // JWT payload 数据
  ctx.body = `Hello, ${ctx.state.user.username}`;
});

自定义存储位置

app.use(jwt({ 
  secret: 'shared-secret', 
  key: 'jwtdata' 
}));

app.use(async (ctx) => {
  console.log(ctx.state.jwtdata); // 使用自定义键名
});

访问原始 Token

app.use(jwt({ 
  secret: 'shared-secret', 
  tokenKey: 'rawToken' 
}));

app.use(async (ctx) => {
  console.log(ctx.state.rawToken); // 原始 token 字符串
});

Passthrough 模式

基础用法

app.use(jwt({ 
  secret: 'shared-secret', 
  passthrough: true 
}));

app.use(async (ctx) => {
  if (ctx.state.user) {
    // 已认证用户
    ctx.body = 'Authenticated content';
  } else {
    // 未认证用户
    ctx.body = 'Public content';
  }
});

访问错误信息

app.use(jwt({ 
  secret: 'shared-secret', 
  passthrough: true 
}));

app.use(async (ctx) => {
  if (ctx.state.jwtOriginalError) {
    // 有 token 但验证失败
    console.log('JWT Error:', ctx.state.jwtOriginalError.message);
  }
});

错误处理

自定义错误处理

app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    if (err.status === 401) {
      ctx.status = 401;
      ctx.body = {
        error: err.originalError ? err.originalError.message : err.message
      };
    } else {
      throw err;
    }
  }
});

Token 验证错误代码

所有 token 验证错误代码可以在 jsonwebtoken 文档 中找到。

常见错误:

  • TokenExpiredError:token 已过期
  • JsonWebTokenError:token 无效
  • NotBeforeError:token 尚未生效

密钥提供方式

方式 1:直接配置

app.use(jwt({ secret: 'static-secret' }));

方式 2:每请求动态密钥

// 通过中间件设置每请求密钥
app.use(async (ctx, next) => {
  ctx.state.secret = getSecretForRequest(ctx);
  await next();
});

// 使用默认密钥(当 ctx.state.secret 不存在时使用)
app.use(jwt({ secret: 'default-secret' }));

完整示例

示例 1:完整应用

const Koa = require('koa');
const jwt = require('koa-jwt');

const app = new Koa();

// 错误处理中间件
app.use(async (ctx, next) => {
  try {
    await next();
  } catch (err) {
    if (err.status === 401) {
      ctx.status = 401;
      ctx.body = {
        code: 'UNAUTHORIZED',
        message: 'Authentication required',
        details: err.originalError ? err.originalError.message : null
      };
    } else {
      ctx.status = err.status || 500;
      ctx.body = {
        code: 'INTERNAL_ERROR',
        message: err.message
      };
    }
  }
});

// 公共中间件
app.use(async (ctx, next) => {
  // 记录请求日志
  console.log(`${ctx.method} ${ctx.url}`);
  await next();
});

// JWT 认证(排除公开路径)
app.use(jwt({ 
  secret: process.env.JWT_SECRET || 'default-secret',
  audience: 'my-api',
  issuer: 'my-auth-service'
}).unless({ 
  path: [
    /^\/public/,
    /^\/login/,
    /^\/health/
  ] 
}));

// 受保护的路由
app.use(async (ctx) => {
  if (ctx.path === '/api/profile') {
    ctx.body = {
      user: ctx.state.user,
      message: 'This is your profile'
    };
  } else if (ctx.path === '/api/data') {
    ctx.body = {
      data: 'Sensitive information',
      accessTime: new Date().toISOString()
    };
  }
});

app.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});

示例 2:使用环境变量和高级配置

const Koa = require('koa');
const jwt = require('koa-jwt');
const { koaJwtSecret } = require('jwks-rsa');

const app = new Koa();

// 根据环境选择配置
const jwtConfig = {
  secret: process.env.JWT_SECRET_TYPE === 'jwks' 
    ? koaJwtSecret({
        jwksUri: process.env.JWKS_URI,
        cache: true,
        rateLimit: true,
        jwksRequestsPerMinute: 5
      })
    : process.env.JWT_SECRET,
  
  audience: process.env.JWT_AUDIENCE,
  issuer: process.env.JWT_ISSUER,
  
  // 从 cookie 或 header 获取 token
  cookie: 'auth_token',
  getToken: function(opts) {
    // 优先从 header 获取
    const headerToken = this.get('authorization');
    if (headerToken && headerToken.startsWith('Bearer ')) {
      return headerToken.substring(7);
    }
    
    // 其次从 cookie 获取
    if (opts.cookie && this.cookies.get(opts.cookie)) {
      return this.cookies.get(opts.cookie);
    }
    
    return null;
  }
};

app.use(jwt(jwtConfig).unless({ 
  path: [
    /^\/docs/,
    /^\/swagger/,
    { url: '/', methods: ['GET'] }
  ] 
}));

// 业务逻辑
app.use(async (ctx) => {
  ctx.body = {
    success: true,
    user: ctx.state.user,
    timestamp: new Date().toISOString()
  };
});

module.exports = app;

注意事项

  1. 安全性

    • 不要将密钥硬编码在代码中
    • 使用环境变量或安全的配置管理系统
    • 定期轮换密钥
  2. 性能

    • 对于高频请求,考虑缓存公钥或 JWKS 响应
    • 使用适当的缓存策略减少网络开销
  3. 版本兼容性

    • koa-jwt v3+ 不再从 jsonwebtoken 导出 sign、verify 和 decode 函数
    • 如需这些功能,直接安装 jsonwebtoken 包
  4. 调试

    • 设置 debug: true 可以在控制台看到详细的验证信息
    • 生产环境应关闭调试模式

相关链接

Vue+Vant+Koa+MongoDB实战:扫码点餐H5全栈系统 全栈开发是当前前端工程师技能拓展的重要方向,其核心在于前后端分离架构下,将UI交互、业务逻辑与数据存储高效串联。Vue作为主流的渐进式JavaScript框架,配合Vant移动端组件库,能快速构建体验流畅的H5界面;Koa凭借轻量的中间件洋葱模型,为后端接口提供了灵活的扩展能力;而MongoDB文档型的存储方式,则完美契合菜品、订单这类天然JSON化的业务数据。四者结合,构成了从页面渲染、接口响应到数据落地的完整闭环。在餐饮消费场景中,用户扫码点餐系统正是这一技术组合的典型落地应用——手机扫码进入H5页面, 阅读详情

相关推荐

Vue3+Vant+Koa2+MongoDB扫码点餐H5全栈项目实战拆解

前后端分离架构已成为现代Web开发的标配,它让前端展示与后端逻辑解耦,显著提升工程可维护性。本文从工程实践视角,剖析一套基于Vue3、Vant、Koa2与MongoDB构建的H5扫码点餐系统。通过讲解RESTful接口设计、JWT鉴权、订单状态机、幂等性处理、MongoDB文档建模及聚合查询等关键技术点,展示如何从零落地一个覆盖点餐、购物车、下单、支付的完整业务闭环。内容兼顾技术科普与实战,适合毕业设计选题、全栈练手及Node后端转型开发者参考,帮助理解真实餐饮场景下的数据建模与业务分层逻辑。

weixin_30764883的博客 340

Koa-jwt 说明文档(机翻润色)

KOA-JWT (机翻润色) node>=7.6.0 npm v3.2.2 这个模块可以让你在你的KOA应用中通过使用JSON WEB TOKEN(以下简称JWT)认证HTTP请求 这个文档做了一个很好的介绍. 如果你使用KOA版本2.+,同时你有一个低于7.6版本的node. 安装koa-jwt@2 主分支(Koajwt git...

weixin_33910759的博客 268

Modbus4J vs EasyModbus4J:哪个Java库更适合你的工业项目?

本文深入对比了Java领域两大Modbus通信库Modbus4J与EasyModbus4J。Modbus4J设计稳健、类型安全,适合复杂业务集成;EasyModbus4J基于Netty,在高并发场景下性能更优。文章从架构、性能、API及生产环境多维度分析,为工业物联网项目选型提供决策依据。

weixin_28475533的博客 309

koa-jwt社区贡献指南:如何参与开源项目开发和问题修复

koa-jwt是一款用于验证JSON Web Tokens的Koa中间件,它能帮助开发者在Koa应用中轻松实现JWT认证功能。作为开源项目,koa-jwt的发展离不开社区贡献者的支持,无论是修复bug、添加新功能还是改进文档,都能为项目注入新的活力。本文将详细介绍如何参与koa-jwt项目的开发和问题修复,帮助新手快速融入开源社区。 ## 一、准备工作:搭建开发环境 参与开源项目的第一步是搭建

gitblog_00248的博客 1034

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

xu_white的博客 7583

Nacos启动报错No DataSource set?5分钟搞定standalone模式配置

本文针对Nacos启动时常见的“No DataSource set”报错,深入解析了其根源在于默认集群模式与外部数据库依赖。提供了两种快速解决方案:通过命令行参数“-m standalone”启动,或直接修改启动脚本配置文件,从而在5分钟内以单机模式成功启动Nacos,无需配置MySQL数据库。

weixin_29234509的博客 464

KOA入门 (一)

KOA入门KOA基本知识常用中间件功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 KOA基本知识 KOA是基于node...

wlm_suzhou的博客 367

深入解析反射式DLL注入:从原理到实战优化

本文深入解析反射式DLL注入技术,从原理到实战优化全面剖析。通过PE文件内存重构、反射加载器实现及免杀增强方案,展示如何绕过安全检测并提升性能。适用于红队行动、内网渗透等场景,是高级攻防对抗中的关键技术。

weixin_28339967的博客 404

Koa REST API 模板:快速构建高效API服务的利器

Koa REST API 模板:快速构建高效API服务的利器 在现代Web开发中,构建RESTful API是常见的需求之一。为了帮助开发者迅速启动这样的项目,posquit0 提供了一个基于 Koa 的 REST API 模板 —— koa-rest-api-boilerplate。这是一个强大的脚手架,它包含了所有你需要构建健壮、高效的API服务的基础设置。 项目简介 koa-rest-api...

gitblog_00056的博客 803

libnice和coturn这两个库有交叉实现的地方,具体有啥区别?

TurnAdmin:是一个TURN的管理工具,此工具能被用来管理用户账号的增删改查。 TurnServer:是TURN和STUN的服务器实现。 Turnutils_uclient: 模拟多个UDP、TCP、TLS或DTLS客户端 Turnutils_peer: 一个简单的无状态UDP-ECHO服务器,用作中继模式中的最终服务器 Turnutils_stunclient: 一个简单的STUN客户端例子 Turnutils_rfc5769check: 检查STUN/TURN协议实现的正确性。 我们..

Langeldep的专栏 1318

180.在 Vue3 中使用 OpenLayers 实现多个多边形的绘制、编辑、删除与清空

【摘要】本文介绍如何在Vue3+TypeScript环境下使用OpenLayers实现多边形地图交互功能。通过Composition API封装核心逻辑,实现了多边形绘制、编辑、删除及清空等操作。关键技术包括:使用VectorLayer管理图形数据,Draw/Modify/Select交互控制,以及通过ref()管理交互状态。文中提供了完整代码示例,并解决了交互对象叠加问题,为开发GIS应用提供了基础模块。该方案支持扩展为数据库存储、后端交互等高级功能。

小彭的博客 769

推荐使用:egg-jwt —— 强大易用的 Egg.js 平台 JWT 认证插件

推荐使用:egg-jwt —— 强大易用的 Egg.js 平台 JWT 认证插件 在当今这个以安全为先的时代,JWT(JSON Web Tokens)成为了现代应用中实现无状态、分布式认证的重要工具。对于基于 Egg.js 框架的开发者来说,egg-jwt 是一个不可或缺的宝藏插件。本文将从四个方面带你深入了解 egg-jwt,展示它如何简化你的身份验证流程,让应用安全又高效。 项目介绍 egg-...

gitblog_01025的博客 1201

【灰度共生矩阵(GLCM)原理及代码实现】

文章主旨详细介绍灰度共生矩阵(Gray-Level Co-occurrence Matrix, GLCM)的生成原理、核心特征量及其在图像纹理分析中的应用,并提供了可运行的Python代码实现。该网页是一篇理论结合实践的优秀技术文章。它不仅清晰地解释了GLCM这一经典纹理分析工具背后的数学原理,还提供了完整、可复现的代码,非常适合计算机视觉或图像处理领域的学习者和开发者入门并实践灰度共生矩阵。读者可以通过运行代码来直观理解GLCM如何工作,并提取图像的纹理特征。

blotemj.blog.youkuaiyun.com 176

Icarus Verilog VVP 仿真引擎深入解析:从 VVP 汇编语法到事件驱动的运行时实现

VVP(Verilog Virtual Processor)是 Icarus Verilog 编译器的运行时仿真引擎,其输入不是 Verilog 源文件,而是由编译器(`iverilog`)生成的一种类汇编语言描述文件。本文以仓库中 [Documentation/developer/guide/vvp/vvp.rst](https://link.gitcode.com/i/8866a6808e93

gitblog_00005的博客 535

2026年运维工程师常见面试选择题

这篇文章总结了30道Linux运维面试常见问题及解析,涵盖基础命令、系统监控、故障排查、数据库、缓存、容器编排等多个方面。主要内容包括: 基础命令使用:如df查看磁盘、free查看内存、top监控进程等 系统监控与故障排查:负载判断、端口检查、进程管理等 中间件相关:Nginx状态码、MySQL主从复制、Redis缓存问题 容器技术:Docker优势、Kubernetes作用 运维理念:高可用、监控告警、发布策略、备份容灾 工作原则:故障处理优先级、运维工程师核心能力 文章不仅提供标准答案,还解析了各命令的

不务正业的猿 191

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Koa 2 + redis + mysql + Jwt + 后台管理

Koa 2 + redis + mysql + Jwt + 后台管理 文章目录Koa 2 + redis + mysql + Jwt + 后台管理Koa解决跨域koa-morgan 日志处理JWT 权限控制全局配置JWT (方法库封装)函数的调用验证码方法封装使用缓存session 、redis全局配置redis 连接和使用(函数封装)函数调用路由控制(接口)全局配置接口编写返回状态码mysql 数据连接和操作mysql 连接对数据库进行操作数据调用调用看路由控制里的(获取菜单管理) Koa解决跨域 //

燃燃的大尾巴 1068

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

使用 koa + typescript + 装饰器搭建 mock 服务

使用 koa + typescript + 装饰器搭建 mock 服务 基本的包信息和运行的脚本 { "name": "mock", "version": "1.0.0", "license": "MIT", "main": "index.js", "scripts": { "start": "node index.js" }, "dependencies": { "chalk": "^4.1.0", "jsonwebtoken": "^8.5.1",

左手121 1136

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

vue+koa2中使用koa-jwt

下载 config/settings.js: db.js: app.js: routes/index.js: routes/users.js vue2前端

344

koa2 mysql sequelize_使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口

nodejs-koa2-mysql-sequelize-jwt技术栈:nodejs, koa2, mysql, sequelize, jwt项目数据层和操作层分明使用koa2框架中间件,参数处理jwt做权限接口验证sequelize管理mysql数据库异步处理async/await已实现登录注册接口,文章增删改查接口喜欢或对你有帮助的话请点star✨✨,或有您有更好的建议和意见,请提出来告知我,可...

weixin_42449311的博客 209

koa react mysql_react + koa2 + mysql 开发个人博客篇 - 优雅的代码,简约的风格

前言使用 react 有一段时间了, 也想用 react 去写点什么,平时接触最多的就是 blog 了,于是乎借助 antd 这个 UI 框架设计出了一个极其简约风格的 spa 博客。目的也是将 react 的生态圈的工具梳理一遍,后端则采用了 koa + sequelize + mysql 的技术选型(我司用的就是这个技术栈啦,所以笔者也用这个了)博客介绍前后台分离式开发(项目中也包含博客的后台...

weixin_29471541的博客 109

探索vue-koa-demo:为什么这个全栈Demo值得每个开发者学习

vue-koa-demo是一个基于Vue2和Koa2构建的全栈开发示例项目,同时支持CSR(客户端渲染)、SSR(服务端渲染)和Docker部署,是初学者和开发者学习全栈开发的理想选择。通过这个项目,你可以快速掌握前后端分离架构的核心概念和实践技巧。 ## 项目架构:清晰的前后端分离设计 vue-koa-demo采用了现代化的前后端分离架构,项目结构清晰,便于理解和扩展。主要目录结构如下:

gitblog_00571的博客 288

Knife4j vs Swagger:Node.js 开发者的API文档革命!

node-knife4j-ui:Node.js生态的Knife4j文档解决方案 填补Knife4j在Node.js生态的空白,提供智能参数折叠、多主题切换、离线导出等核心功能,新增JWT自动注入等企业级特性。性能优势显著:万级接口加载<2s(Swagger UI>5s),内存占用低,支持微服务网关聚合文档。 快速体验: npm install node-knife4j-ui 支持Express/Koa框架,提供静态文件服务与Swagger规范集成,开箱即用。 🔗 npm | GitHub

m0_55783584的博客 473

jsonwebtoken 使用教程

本系列是我的常用 koa 中间件使用笔记,防止忘记使用方法而作记录 基本使用 const jwt = require('jsonwebtoken'); const secretKey = '&*^R*G&(FRDwp4eg3' //secret const expiresIn = 60 * 60 * 24 * 30; //时效 (秒) //生成jwt function generateToken(uid) { const token = jwt.sign..

nullccc的博客 2945

node 生产的env文件怎么注入_干货:手把手教你用Node.js 搭建一个 API 接口服务

点击上方“深圳湾码农“,回复“2”进交流群加入我们一起学习,天天进步前言因为最近打算自己搭建一个自己的博客系统,用来记录日常的学习和提升一下写作水平,所以能就打算自己搭建一下前后端项目。在网上找了下,也没有找到合适(现成)的项目,所以就打算自己动手来搭建一下。这篇文章主要描述如何搭建一个node的API接口服务。技术栈简述网上的node框架也挺多的,用的较多的有egg,express,k...

weixin_39950081的博客 244

nodejs+vue农村集体产权管理系统express-koa框架

简单说,一个管安全规则,一个管身份凭证,组合起来为Web应用打造可靠防护。2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。

bishe288的博客 152
上一篇: webpack Tapable官方文档(中文翻译)
若安安
博客等级 码龄7年 28粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值