docs: 补充收支记录页 AI 生成规则、CORS/反向代理与邮箱检查进度时间戳

同步近期 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 长期地址引用。
This commit is contained in:
2026-10-13 22:39:40 +08:00
parent 5eb1d331f9
commit d94d4e1ed5
10 changed files with 72 additions and 10 deletions
+39
View File
@@ -442,6 +442,44 @@ export async function captureAiRule(page: Page): Promise<void> {
}
}
/**
* 截取「收支记录 → 批量操作 → AI 生成规则」弹窗(基于勾选账单生成规则)。
*
* <p>仅触发规则建议生成(只读),不点击「创建勾选规则」,不修改数据。
* 需目标环境已启用 AI 且存在可勾选账单。</p>
*
* @param page Page 实例
*/
export async function captureAiRuleFromTransactions(page: Page): Promise<void> {
try {
await page.setViewportSize({ width: 1440, height: 1000 })
await page.goto(BASE_URL + '/transactions')
await waitPage(page, { selector: PAGE_READY })
// 进入批量操作模式,勾选前若干条账单
if (!(await clickText(page, '批量操作'))) throw new Error('未找到「批量操作」按钮')
await page.waitForTimeout(500)
const checkboxes = page.locator('.n-data-table-tbody .n-checkbox')
const count = Math.min(await checkboxes.count(), 5)
for (let i = 0; i < count; i++) {
await checkboxes.nth(i).click({ force: true }).catch(() => undefined)
}
await page.waitForTimeout(300)
// 点击「AI 生成规则」,等待弹窗与规则建议表(真实 AI 调用)
if (!(await clickText(page, 'AI 生成规则'))) throw new Error('未找到「AI 生成规则」按钮')
const modal = page.locator('.n-modal').first()
await modal.waitFor({ state: 'visible', timeout: 30000 })
await modal.locator('.n-data-table-tbody tr').first().waitFor({ state: 'visible', timeout: 90000 })
await page.waitForLoadState('networkidle', { timeout: 90000 }).catch(() => undefined)
await page.waitForTimeout(1000)
await modal.screenshot({ path: resolve(ELEM_DIR, 'ai-rule-transactions.png') })
console.log('[OK] modal/ai-rule-transactions')
} catch (err) {
console.log(`[FAIL] modal/ai-rule-transactions: ${err}`)
}
}
/**
* 截取系统设置的配置面板。
*
@@ -641,6 +679,7 @@ async function main(): Promise<void> {
await captureEditRecord(page)
await captureInlineCreate(page)
await captureAiRule(page)
await captureAiRuleFromTransactions(page)
await captureAiRecordImage(page)
await captureBillDetail(page)
await captureChannelAi(page)