Repository navigation
Releases: erikwang2013/apidoc-rust
Releases · erikwang2013/apidoc-rust
Release list
v2.0.0
⚠️ 破坏性变更(从 1.x 升级必读)
- 登录端点改了:
GET /apidoc/auth?password=…→POST /apidoc/auth(JSON body{"password": "...", "appKey": "..."},appKey用于应用独立密码)。密码不再出现在 URL、访问日志与浏览器历史中。 - 令牌格式改了:改为
base64url(payload).base64url(HMAC-SHA256(payload)),签名密钥 = HMAC(secret_key, 凭据)——改密码即刻作废旧令牌,1.x 的旧令牌全部失效。 secret_key缺省值改了:不再有公开默认值,缺省时取进程内随机密钥(进程重启会作废已签发令牌)。多实例部署请显式配置secret_key。
主要变化
鉴权(Rust 原生实现)
- POST 登录 + 服务端恒定时间比对;空密码(全局/应用)两侧一律失败关闭
- 登录失败退避:按凭据分桶,前 3 次不罚,之后 1s→…封顶 10s,静默 2 分钟清零
- 带凭据/token 的响应统一
Cache-Control: no-store - 依赖:移除
md5,新增hmac/sha2/base64/getrandom
修复
/apidoc/share以appKey传参时可越权换出全局 token- 宏 id 撞车:同模块重名函数(impl 方法、嵌套 fn)会静默合并成一个端点
- 应用分享链接打不开:首次请求前未先把
?app=落成当前应用 - swagger:path 参数改以 URL 模板为准;success 状态码校验、重复码告警
- 生成物转义:codegen 内置模板(新增
url_js/method_js/fn_name与 SQL 字面量)、TypeScript 导出、markdown 表格与代码围栏 - mock 缓存按实例隔离;ui.js 侧边栏高亮错组、emoji 密码无法登录、分享 token 落盘后从地址栏抹除
leak()改进程内驻留;/apidoc/generate改构建期预渲染;响应体改Bytes零拷贝
工程
- 声明
rust-version = "1.82" - 13 份 README 全量同步(含 2.0 升级提示),39 张图更新,补
LICENSE(MIT)
Full Changelog: v1.6.2...v2.0.0
v1.6.2
文档修复:README 内 6 处图片与 12 个语言切换链接改为绝对 URL。
crates.io 渲染 README 时会把相对路径拼接在 crate 目录(crates/apidoc/)之后,导致图片与翻译页链接全部 404;改为 GitHub 绝对链接后,crates.io 与 GitHub 两端渲染均正常。无代码改动。
v1.6.1
重构与去重批次(净约 -450 行),无新功能。
优化
- axum/actix 适配器收敛出框架无关
route_core(296+314 → 92+85+217 行),公共 API 不变,双层 clone 仪式清零 - 8 个适配器集成测试共享
tests/common/断言体(driver 1825→603 行),测试数与断言零缩水 - 版本号单一来源:删除包内 VERSION,swagger
info.version改取env!("CARGO_PKG_VERSION")(今后发版只需同步根 VERSION ↔ Cargo.toml) - 两个包补齐
readme = "../../README.md":crates.io 页面从此有 README(此前一直空白) .gitignore清 52 行模板误并入块;export/markdown.rs的fn cell提层
行为变化(唯一,已加断言钉住)
- axum 守卫失败 401 的 Content-Type 由
text/plain; charset=utf-8收敛为application/json(与 actix 一致;响应体本就是 JSON)
验证
- 5 配置测试矩阵 0 failed(82/92/120/119/147,逐 binary 与干净基线一致)
- api.json 输出三份 sha256 完全一致(
cargo test覆盖 + 字节比对);clippy 零新增 warning cargo package内容核对:README.md ✓ / route_core.rs ✓ / 无 VERSION ✓
v1.6.0
版本 1.6.0 · v2 五项能力
新增
- 数据表字段引用:
#[apidoc::table("user")]+ApidocConfig.tables,表字段平铺并入returned(与ref互不覆盖,每端点只打一次) - 文档缓存:
CacheConfig { enable, ttl },/apidoc/mock按 (url, method) 记忆化,ttl = 0永久 - 分享链接:
GET /apidoc/share?app=&url=&method=&base=→ 深链 JSON;文档页分享按钮(剪贴板,失败降级输入框)、?app=&ep=&method=&token=深链;鉴权开启时链接自带 token,打开免密 - 代码生成器:
GET /apidoc/generate?template=+ 内置api.ts/handler.rs/schema.sql;模板语法{{变量}}与可嵌套{{#each}}(深度上限 32、展开预算 10 万,超限整块原样保留);ApidocConfig.codegen同名覆盖内置 - 调试事件:在线调试面板前置/后置脚本(
new Function('ctx', code),localStorage 持久化),前置可改 ctx、后置可替换展示文本,报错不中断请求
安全
- 修复分享路由鉴权绕过:守卫改按被分享的应用校验 —— 修复前「无凭据即可铸造应用 token」,全局 token 亦可提权到任意独立密码应用(独立复核发现,双适配器实测复现)
兼容
- v2 配置字段全部
serde(skip):未使用时 api.json 与 v1 字节级一致 - 测试 147 通过 / 0 失败
已知边界
- 表字段为平铺标量列(无 children);
ref+table同体的目标不再二次传播 - codegen 不转义用户数据(输入为编译期注解与项目配置,输出 text/plain)
share的base参数可指向任意 host(该接口本就返回 token)- 空应用密码:
/apidoc/auth会签发、share拒签(失败关闭),差异已注释
v1.5.0
版本 1.5.0
文档 UI 宠物整合
crates/apidoc/src/pet.svg随包发布,适配器挂载GET /apidoc/pet.svg(axum / actix-web 各一条路由,不设鉴权守卫,与 UI 页同级)- 文档页三处用上宠物:favicon、页头 logo、密码遮罩 logo
文档全量同步(12 语言)
- README 恢复 apidoc-php 版式:宠物图 + 项目简介 + 「✨项目说明」10 条
- 新增 Social Preview 图(1280×640)
- 12 个译文 README 同步:宠物图、tagline、项目介绍、项目说明、Roadmap v2、版本号(含 📖 标题对齐)
版本
VERSION1.4.0 → 1.5.0;发布包版本由 0.1.0 统一到 1.5.0(与项目版本同号)- crates.io:
apidoc-macros1.5.0 +apidoc-rust1.5.0(修复 0.1.0 依赖 apidoc-macros 被 yank 后新装用户解析失败的问题)
v1.4.0
v1.3.0
v1.2.0
v1.1.0
v1.0.0
初始提交:M1 核心 + M2 axum 适配器 + 完整文档 - M1: 7 个属性宏(title/desc/method/url/param/query/returned)+ linkme 静态注册 + DocRegistry 聚合 + api.json 输出,13 测试 - M2: apidoc-axum 薄适配器(/apidoc UI + /apidoc/api.json + CORS)+ include_str! 内嵌极简 UI + 分组目录,18 测试 - README(中文)+ 架构/功能/生命周期 SVG(水印 https://erik.xyz)+ 12 语言 i18n 文档