-- 用户表:存储系统用户的基本信息和登录凭证 CREATE TABLE IF NOT EXISTS t_user ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID,主键自增', username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名,唯一标识,用于登录', password_hash VARCHAR(255) NOT NULL COMMENT '密码哈希值,使用BCrypt加密存储', nickname VARCHAR(50) COMMENT '用户昵称,显示名称', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ); -- 分类表:存储收支分类信息,支持用户自定义 CREATE TABLE IF NOT EXISTS t_category ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '分类ID,主键自增', user_id BIGINT NOT NULL COMMENT '所属用户ID', name VARCHAR(50) NOT NULL COMMENT '分类名称', type VARCHAR(10) NOT NULL COMMENT '分类类型:INCOME-收入,EXPENSE-支出', icon VARCHAR(50) COMMENT '分类图标,可选', sort_order INT NOT NULL DEFAULT 0 COMMENT '排序序号,数值越小越靠前', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', INDEX idx_user_id (user_id) COMMENT '用户ID索引', INDEX idx_user_type (user_id, type) COMMENT '用户ID+类型联合索引' ); -- 收支记录表:存储每一笔收入或支出的详细信息 CREATE TABLE IF NOT EXISTS t_transaction ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '记录ID,主键自增', user_id BIGINT NOT NULL COMMENT '所属用户ID', category_id BIGINT COMMENT '所属分类ID,可为空表示未分类', type VARCHAR(10) NOT NULL COMMENT '记录类型:INCOME-收入,EXPENSE-支出', amount DECIMAL(12, 2) NOT NULL COMMENT '金额,精确到分', payment_method VARCHAR(30) COMMENT '支付方式:WECHAT-微信,ALIPAY-支付宝,CASH-现金,BANK-银行卡', remark VARCHAR(255) COMMENT '备注说明', remark_hidden TINYINT(1) NOT NULL DEFAULT 0 COMMENT '备注是否隐藏:1-隐藏,0-显示', external_no VARCHAR(64) COMMENT '外部账单交易号,用于账单导入去重', transaction_time DATETIME NOT NULL COMMENT '交易发生时间', include_in_stats TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否计入统计:1-计入,0-不计入(如借款、转账等)', raw_data JSON COMMENT '账单导入的原始完整数据(结构化JSON),手动记录为空', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', INDEX idx_user_id (user_id) COMMENT '用户ID索引', INDEX idx_category_id (category_id) COMMENT '分类ID索引', INDEX idx_transaction_time (transaction_time) COMMENT '交易时间索引', INDEX idx_user_time (user_id, transaction_time) COMMENT '用户ID+交易时间联合索引', UNIQUE INDEX uk_user_external (user_id, external_no) COMMENT '用户ID+外部交易号唯一索引,用于导入去重' ); -- 标签表:存储用户自定义标签,用于给交易打标签 CREATE TABLE IF NOT EXISTS t_tag ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '标签ID,主键自增', user_id BIGINT NOT NULL COMMENT '所属用户ID', name VARCHAR(50) NOT NULL COMMENT '标签名称', color VARCHAR(20) COMMENT '标签颜色,用于前端展示', sort_order INT NOT NULL DEFAULT 0 COMMENT '排序序号,数值越小越靠前', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', INDEX idx_user_id (user_id) COMMENT '用户ID索引', UNIQUE INDEX uk_user_name (user_id, name) COMMENT '用户ID+标签名唯一索引' ); -- 交易标签关联表:交易与标签的多对多关系 CREATE TABLE IF NOT EXISTS t_transaction_tag ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '关联ID,主键自增', transaction_id BIGINT NOT NULL COMMENT '交易记录ID', tag_id BIGINT NOT NULL COMMENT '标签ID', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', 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+创建时间联合索引' );