feat: 接入 DeepSeek,新增 AI 分类建议、自然语言查询与智能记账

- 后端新增 AI 模块:DeepSeek 客户端、用户级配置表 t_ai_config、用量记录表 t_ai_usage
- 批量设置支持 AI 推荐分类与标签,并可一键应用
- 交易列表支持自然语言查询,解析为筛选条件确认后应用
- 支持自然语言记账,解析后预填新增表单
- 新增 AI 设置页:启用开关、API Key、接口地址、模型、连通性测试与用量统计
- 交易列表重排:AI 查询区、已激活筛选标签、备注与查询历史缓存
- 账单导入默认分类下拉补充分类图标
- 顶部用户入口改为下拉菜单(AI 设置 / 退出登录)
This commit is contained in:
2026-09-17 18:26:03 +08:00
parent 10fa1b5e96
commit 49c70a732d
38 changed files with 3951 additions and 27 deletions
+31
View File
@@ -65,3 +65,34 @@ CREATE TABLE IF NOT EXISTS t_transaction_tag (
UNIQUE INDEX uk_transaction_tag (transaction_id, tag_id) COMMENT '交易+标签唯一索引',
INDEX idx_tag_id (tag_id) COMMENT '标签ID索引'
);
-- AI 配置表:存储每个用户的 AI 智能建议相关配置
CREATE TABLE IF NOT EXISTS t_ai_config (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID,主键自增',
user_id BIGINT NOT NULL COMMENT '所属用户ID',
enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否启用AI智能建议:1-启用,0-关闭',
api_key VARCHAR(255) COMMENT 'DeepSeek API Key(明文存储)',
base_url VARCHAR(255) NOT NULL DEFAULT 'https://api.deepseek.com' COMMENT 'API 基础地址',
model VARCHAR(50) NOT NULL DEFAULT 'deepseek-chat' COMMENT '使用的模型名称',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE INDEX uk_user_id (user_id) COMMENT '用户ID唯一索引,每个用户一条配置'
);
-- AI 使用记录表:记录每次调用 DeepSeek 的用量与结果
CREATE TABLE IF NOT EXISTS t_ai_usage (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '记录ID,主键自增',
user_id BIGINT NOT NULL COMMENT '所属用户ID',
type VARCHAR(20) NOT NULL COMMENT '调用类型:SUGGEST-生成建议,TEST-测试连接',
model VARCHAR(50) COMMENT '模型名称',
transaction_count INT NOT NULL DEFAULT 0 COMMENT '本次分析的记录数',
prompt_tokens INT NOT NULL DEFAULT 0 COMMENT '输入 token 数',
completion_tokens INT NOT NULL DEFAULT 0 COMMENT '输出 token 数',
total_tokens INT NOT NULL DEFAULT 0 COMMENT '总 token 数',
cached_tokens INT NOT NULL DEFAULT 0 COMMENT '缓存命中的输入 token 数',
success TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否成功:1-成功,0-失败',
error_message VARCHAR(500) COMMENT '失败原因',
duration_ms BIGINT COMMENT '调用耗时(毫秒)',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
INDEX idx_user_created (user_id, created_at) COMMENT '用户ID+创建时间联合索引'
);