同步近期 ledgerly 功能与配置变更到文档站:新增收支记录页「AI 生成规则」入口的用户与开发说明、补充新接口与规则应用逻辑、修正 CORS/反向代理与运行环境编码说明,并更新邮箱检查进度时间戳描述。 变更内容: - guide/transactions.md 批量操作区新增「AI 生成规则」按钮与「AI 生成规则(从勾选账单)」小节(含「同时应用到勾选账单」),引用新截图。 - guide/ai.md、guide/rules.md、guide/pages.md 补充两处生成入口与「同时应用」说明。 - dev/api.md 新增 POST /api/ai/rule/apply-transactions;dev/rule-engine.md、dev/ai.md 补充 applyToTransactions 与两个生成入口。 - dev/build-deploy.md 将 CORS 更新为放开全部来源并信任反向代理转发头,新增运行环境 UTF-8 locale 说明。 - guide/email-bills.md 补充「立即检查」进度每行带 HH:mm:ss 时间戳。 - scripts/ts/capture-elements.ts 新增 captureAiRuleFromTransactions 截图场景(交易页 AI 生成规则弹窗)。 说明: - 新截图 elements/ai-rule-transactions.png 已上传 OSS,正文以 OSS 长期地址引用。
110 lines
7.7 KiB
Markdown
110 lines
7.7 KiB
Markdown
# API 文档
|
||
|
||
系统使用 **Knife4j(OpenAPI 3)** 生成接口文档,后端启动后可直接访问。
|
||
|
||
## 访问入口
|
||
|
||
| 入口 | 地址 | 说明 |
|
||
|---|---|---|
|
||
| Knife4j UI | `http://<host>:<port>/doc.html` | 增强版接口文档界面 |
|
||
| OpenAPI JSON | `http://<host>:<port>/v3/api-docs` | 标准 OpenAPI 描述 |
|
||
| Swagger UI | `http://<host>:<port>/swagger-ui/index.html` | 原生界面 |
|
||
|
||
开发模式下默认端口为 8080,例如 http://localhost:8080/doc.html。
|
||
|
||
## 认证
|
||
|
||
- 接口统一使用 **JWT Bearer** 鉴权,登录接口返回 token 后,在请求头携带:
|
||
|
||
```text
|
||
Authorization: Bearer <token>
|
||
```
|
||
|
||
- Knife4j 配置中已声明全局 `Bearer` 安全方案,可在文档界面直接填入 token 调试。
|
||
- 无需鉴权的接口:`/api/user/login`、`/api/user/register`、`/api/user/registration-status`、`/api/database/status`。
|
||
- 日志实时推送等 SSE 接口因 `EventSource` 无法自定义请求头,兼容通过 `?token=` 查询参数鉴权。
|
||
|
||
## 接口数据加密
|
||
|
||
后端支持对 `/api/**` 的**请求体与响应体**做端到端加密(RSA + AES-GCM),浏览器登录后自动完成握手,对使用者透明。该能力为**机会式**:未携带加密会话头的请求按明文处理,因此 Knife4j 等工具仍可直接明文调试接口。
|
||
|
||
- **握手**:前端先 `GET /api/crypto/public-key` 获取 RSA 公钥(返回 `{enabled, keyId, algorithm, publicKey}`),本地生成 32 字节 AES 密钥并用 **RSA-OAEP(SHA-256)** 加密,再 `POST /api/crypto/handshake`(body `{keyId, key}`)换取 `sessionId`;此后请求统一携带 `X-Crypto-Session: <sessionId>` 头。
|
||
- **算法**:**AES-256-GCM**(IV 12 字节、认证标签 128 位),GCM 的 AAD 绑定 `sessionId` 以防跨会话重放;AES 会话密钥仅存后端内存,RSA 密钥对在首次启动时自动生成并持久化到运行目录 `config/crypto-keys.json`。
|
||
- **信封格式**:加解密对象为 JSON 信封 `{"enc":"A256GCM","iv":"<Base64>","data":"<Base64 密文+标签>"}`。
|
||
- **会话**:有效期 2 小时、上限 2000 个;失效返回业务码 `4201`,前端自动重新握手并重试一次。
|
||
- **豁免范围**:SSE 流式接口、multipart 文件上传、二进制下载/图片(导出、`/api/ai/image/**`)与握手接口本身不做加解密;`/api/crypto/**` 无需鉴权。
|
||
- **开关**:由编译期常量 `CryptoConstants.API_ENCRYPTION_ENABLED` 控制;关闭后 `public-key` 返回 `enabled:false`,前端自动回退明文。
|
||
|
||
## 接口分组
|
||
|
||
| 控制器 | 路径前缀 | 说明 |
|
||
|---|---|---|
|
||
| `UserController` | `/api/user` | 登录、注册、用户信息、注册开关、修改密码 |
|
||
| `TransactionController` | `/api/transaction` | 收支记录增删改查、批量创建与操作、备注隐藏、导出、交易渠道选项 |
|
||
| `TransactionGroupController` | `/api/transaction/group` | 账单关系组的查询、创建、更新、删除与名称历史 |
|
||
| `BillImportController` | `/api/transaction/import` | 账单解析与确认导入 |
|
||
| `ChannelController` | `/api/channel` | 用户自定义交易渠道的增删改查 |
|
||
| `CategoryController` | `/api/category` | 分类管理 |
|
||
| `TagController` | `/api/tag` | 标签管理 |
|
||
| `RuleController` | `/api/rule` | 自定义规则(列表、分页查询、增删改、启停、批量删除) |
|
||
| `StatisticsController` | `/api/statistics` | 统计汇总、分类、趋势、分组 |
|
||
| `AiController` | `/api/ai` | AI 建议、查询、智能查数、文字/图片记账、渠道/关系/规则生成、统计搜索、用量 |
|
||
| `NotificationController` | `/api/notification` | 通知配置、渠道、发送日志 |
|
||
| `EmailBillController` | `/api/email-bill` | 邮箱配置、发件人规则、待处理账单 |
|
||
| `LogController` | `/api/log` | 访问日志、登录日志、运行日志与 SSE |
|
||
| `DatabaseController` | `/api/database` | 数据库状态、测试与配置(含 SSE 进度) |
|
||
| `AppConfigController` | `/api/app` | 应用配置(通知链接、日志保留) |
|
||
| `UserSettingController` | `/api/setting` | 用户偏好(账单来源统计默认值、展示样式、隐藏备注显示、分页、导航) |
|
||
|
||
## 关键接口
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|---|---|---|
|
||
| GET | `/api/transaction/channels` | 获取交易渠道选项(内置 + 当前用户自定义,含 `code`/`name`/`builtin`) |
|
||
| POST | `/api/transaction/batch` | 批量创建交易记录(逐条可带 `imageId`/`rawData`),导入时按「类型+金额+时间」跳过重复 |
|
||
| PUT | `/api/transaction/{id}/remark-hidden` | 隐藏 / 取消隐藏某条记录的备注 |
|
||
| GET / POST / PUT / DELETE | `/api/channel`、`/api/channel/{id}` | 自定义渠道列表(含使用账单数)、新建、改名、删除 |
|
||
| GET | `/api/transaction/group/by-transaction/{id}` | 查询某笔账单所属的全部关系组(含成员快照) |
|
||
| GET | `/api/transaction/group/names` | 关系名称历史(可按 `type` 过滤,去重、倒序) |
|
||
| POST / PUT / DELETE | `/api/transaction/group`、`/api/transaction/group/{id}` | 创建 / 更新 / 删除账单关系组(删除仅解除关联,不删除账单) |
|
||
| PUT | `/api/user/password` | 修改当前登录用户的密码(校验原密码,新旧需不同) |
|
||
| POST | `/api/ai/record/image` | 上传一至多张账单/支付截图(字段 `files`),调用视觉模型识别为多条交易记录 |
|
||
| POST | `/api/ai/record/image/stream` | 图片记账(SSE):实时推送识别进度,结束返回完整结果 |
|
||
| GET | `/api/ai/image/{id}` | 查看本人上传的图片记账图片,`?thumbnail=true` 返回缩略图 |
|
||
| POST | `/api/ai/channel` | 由自然语言描述生成交易渠道名称 |
|
||
| POST | `/api/ai/relation` | 由关联账单生成关系名称与备注 |
|
||
| POST | `/api/ai/sql` | 智能查数:自然语言生成只读 SQL 并执行 |
|
||
| GET / DELETE | `/api/ai/sql/history` | 查询 / 清空智能查数提问历史(`limit` 上限 200) |
|
||
| GET | `/api/rule/page` | 分页查询规则(`keyword` / `enabled` / `type`) |
|
||
| DELETE | `/api/rule/batch` | 批量删除规则(body `{ ids }`,返回实际删除数) |
|
||
| POST | `/api/ai/rule/suggest` | 依据所选已打标签记录生成规则建议(含 `duplicate` 标记) |
|
||
| POST | `/api/ai/rule/apply` | 批量创建规则(自动去重、按需新建分类/标签) |
|
||
| POST | `/api/ai/rule/apply-transactions` | 按传入规则对指定交易做本地匹配并应用(命中则覆盖分类、追加标签,必要时新建;纯本地匹配,不外发数据) |
|
||
| POST | `/api/ai/statistics` | 自然语言解析为统计面板参数 |
|
||
| GET / PUT | `/api/setting/excluded-display-style` | 查询 / 更新「不计入统计」记录展示样式 |
|
||
| GET / PUT | `/api/setting/show-hidden-data` | 查询 / 更新是否显示已隐藏备注的记录 |
|
||
| GET / PUT | `/api/setting/chart-click-navigation` | 查询 / 更新统计面板图表点击是否跳转明细 |
|
||
| GET / PUT | `/api/setting/pagination-prefs` | 查询 / 更新表格分页候选列表与默认每页条数 |
|
||
| GET / PUT | `/api/setting/nav-menu` | 查询 / 更新左侧导航顺序与显隐 |
|
||
| GET / PUT | `/api/setting/bill-source-include-in-stats` | 查询 / 更新按账单来源的「计入统计」默认值 |
|
||
| POST | `/api/database/config/stream` | 应用数据库配置并通过 SSE 推送进度(另有 `/api/database/test/stream`) |
|
||
|
||
## 统一响应结构
|
||
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"message": "success",
|
||
"data": {}
|
||
}
|
||
```
|
||
|
||
- `code` 非 200 表示业务失败,`message` 为错误信息。
|
||
- 分页接口的 `data` 为 `PageResult`(`records` / `total` 等)。
|
||
- 数据库未配置时返回业务码 `5031`,前端据此跳转初始化引导页。
|
||
|
||
## 相关文档
|
||
|
||
- [整体架构](/dev/architecture)
|
||
- [项目结构](/dev/project-structure)
|