211 lines
11 KiB
SQL
211 lines
11 KiB
SQL
-- 创建数据库
|
||
CREATE DATABASE IF NOT EXISTS accounting_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||
|
||
USE accounting_db;
|
||
|
||
-- 用户表
|
||
CREATE TABLE IF NOT EXISTS `user` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
|
||
`username` VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
|
||
`password` VARCHAR(255) NOT NULL COMMENT '密码(加密)',
|
||
`nickname` VARCHAR(50) COMMENT '昵称',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_username` (`username`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
|
||
|
||
-- 分类表
|
||
CREATE TABLE IF NOT EXISTS `category` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '分类ID',
|
||
`user_id` BIGINT COMMENT '用户ID(NULL表示系统预设分类)',
|
||
`name` VARCHAR(50) NOT NULL COMMENT '分类名称',
|
||
`icon` VARCHAR(100) COMMENT '图标',
|
||
`type` TINYINT NOT NULL COMMENT '类型:1-支出,2-收入',
|
||
`sort_order` INT DEFAULT 0 COMMENT '排序顺序',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_user_id` (`user_id`),
|
||
INDEX `idx_type` (`type`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='分类表';
|
||
|
||
-- 账单表
|
||
CREATE TABLE IF NOT EXISTS `bill` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '账单ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`account_id` BIGINT COMMENT '账户ID',
|
||
`category_id` BIGINT NOT NULL COMMENT '分类ID',
|
||
`amount` DECIMAL(10,2) NOT NULL COMMENT '金额',
|
||
`description` VARCHAR(255) COMMENT '描述',
|
||
`bill_date` DATE NOT NULL COMMENT '账单日期',
|
||
`image_url` VARCHAR(500) COMMENT '图片URL',
|
||
`type` TINYINT COMMENT '类型:1-支出,2-收入',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_user_id` (`user_id`),
|
||
INDEX `idx_account_id` (`account_id`),
|
||
INDEX `idx_category_id` (`category_id`),
|
||
INDEX `idx_bill_date` (`bill_date`),
|
||
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE,
|
||
FOREIGN KEY (`account_id`) REFERENCES `account` (`id`) ON DELETE RESTRICT,
|
||
FOREIGN KEY (`category_id`) REFERENCES `category` (`id`) ON DELETE RESTRICT
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账单表';
|
||
|
||
-- 账户表
|
||
CREATE TABLE IF NOT EXISTS `account` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '账户ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`name` VARCHAR(50) NOT NULL DEFAULT '默认账户' COMMENT '账户名称',
|
||
`initial_balance` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '初始余额',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_user_id` (`user_id`),
|
||
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE,
|
||
UNIQUE KEY `uk_user_account` (`user_id`) COMMENT '每个用户只有一个账户'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账户表';
|
||
|
||
-- 预算表
|
||
CREATE TABLE IF NOT EXISTS `budget` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '预算ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`year` INT NOT NULL COMMENT '年份',
|
||
`month` INT NOT NULL COMMENT '月份(1-12)',
|
||
`amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '预算金额',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_user_id` (`user_id`),
|
||
INDEX `idx_year_month` (`year`, `month`),
|
||
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE,
|
||
UNIQUE KEY `uk_user_year_month` (`user_id`, `year`, `month`) COMMENT '每个用户每个月只有一个预算'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='预算表';
|
||
|
||
-- OCR记录表
|
||
CREATE TABLE IF NOT EXISTS `ocr_record` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'OCR记录ID',
|
||
`bill_id` BIGINT COMMENT '账单ID(识别成功后关联)',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`image_url` VARCHAR(500) NOT NULL COMMENT '图片URL',
|
||
`ocr_result` TEXT COMMENT 'OCR识别结果(JSON格式)',
|
||
`parsed_amount` DECIMAL(10,2) COMMENT '解析出的金额',
|
||
`parsed_merchant` VARCHAR(255) COMMENT '解析出的商户名称',
|
||
`parsed_date` DATE COMMENT '解析出的日期',
|
||
`confidence` DECIMAL(5,2) COMMENT '置信度',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_bill_id` (`bill_id`),
|
||
INDEX `idx_user_id` (`user_id`),
|
||
FOREIGN KEY (`bill_id`) REFERENCES `bill` (`id`) ON DELETE SET NULL,
|
||
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OCR记录表';
|
||
|
||
-- 黄金价格记录表
|
||
CREATE TABLE IF NOT EXISTS `gold_price` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '记录ID',
|
||
`gold_id` VARCHAR(20) NOT NULL COMMENT '黄金品种ID',
|
||
`gold_name` VARCHAR(50) COMMENT '黄金品种名称',
|
||
`price` DECIMAL(10,2) NOT NULL COMMENT '当前价格',
|
||
`price_change` DECIMAL(10,2) COMMENT '涨跌额',
|
||
`price_change_percent` DECIMAL(5,2) COMMENT '涨跌百分比',
|
||
`high_price` DECIMAL(10,2) COMMENT '最高价',
|
||
`low_price` DECIMAL(10,2) COMMENT '最低价',
|
||
`open_price` DECIMAL(10,2) COMMENT '开盘价',
|
||
`yesterday_close` DECIMAL(10,2) COMMENT '昨收价',
|
||
`update_time` DATETIME NOT NULL COMMENT 'API返回的更新时间',
|
||
`price_date` DATE NOT NULL COMMENT '价格日期',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_gold_id` (`gold_id`),
|
||
INDEX `idx_price_date` (`price_date`),
|
||
INDEX `idx_gold_date` (`gold_id`, `price_date`) COMMENT '索引:用于按日期查询'
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='黄金价格记录表';
|
||
|
||
-- 笔记目录表
|
||
CREATE TABLE IF NOT EXISTS `note_folder` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '目录ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`parent_id` BIGINT DEFAULT NULL COMMENT '父目录ID,NULL 表示根目录',
|
||
`name` VARCHAR(100) NOT NULL COMMENT '目录名',
|
||
`sort_order` INT NOT NULL DEFAULT 0 COMMENT '同级排序',
|
||
`deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0正常 1已删除',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_user_parent` (`user_id`, `deleted`, `parent_id`),
|
||
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='笔记目录表';
|
||
|
||
-- 笔记表
|
||
CREATE TABLE IF NOT EXISTS `note` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '笔记ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`folder_id` BIGINT DEFAULT NULL COMMENT '所属目录ID,NULL 表示未分类',
|
||
`title` VARCHAR(200) NOT NULL COMMENT '标题',
|
||
`content` LONGTEXT COMMENT 'Markdown正文',
|
||
`summary` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '摘要(列表页展示,避免查询正文)',
|
||
`tags` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '标签,逗号分隔',
|
||
`is_pinned` TINYINT NOT NULL DEFAULT 0 COMMENT '是否置顶:0否 1是',
|
||
`source_path` VARCHAR(500) NOT NULL DEFAULT '' COMMENT '导入来源文件名',
|
||
`deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0正常 1已删除',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_user_updated` (`user_id`, `deleted`, `update_time`),
|
||
INDEX `idx_user_folder` (`user_id`, `deleted`, `folder_id`),
|
||
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE,
|
||
FOREIGN KEY (`folder_id`) REFERENCES `note_folder` (`id`) ON DELETE SET NULL
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='笔记表';
|
||
|
||
-- 插入预设分类(支出)
|
||
-- icon 是「图标名」不是 emoji(2026-09-24 起),对应 App 的 assets/icons/<name>.svg。
|
||
-- 用图标名是为了跨端画风一致:同一个 emoji 在安卓/iOS 上长得不一样。
|
||
-- 存量数据的迁移见 migration_icons_to_names.sql
|
||
INSERT INTO `category` (`user_id`, `name`, `icon`, `type`, `sort_order`) VALUES
|
||
(NULL, '餐饮', 'food', 1, 1),
|
||
(NULL, '交通', 'transport', 1, 2),
|
||
(NULL, '购物', 'shopping', 1, 3),
|
||
(NULL, '娱乐', 'entertainment', 1, 4),
|
||
(NULL, '医疗', 'medical', 1, 5),
|
||
(NULL, '教育', 'education', 1, 6),
|
||
(NULL, '住房', 'housing', 1, 7),
|
||
(NULL, '水电', 'utilities', 1, 8),
|
||
(NULL, '通讯', 'phone', 1, 9),
|
||
(NULL, '其他', 'other', 1, 10);
|
||
|
||
-- 插入预设分类(收入)
|
||
INSERT INTO `category` (`user_id`, `name`, `icon`, `type`, `sort_order`) VALUES
|
||
(NULL, '工资', 'salary', 2, 1),
|
||
(NULL, '奖金', 'bonus', 2, 2),
|
||
(NULL, '投资', 'invest', 2, 3),
|
||
(NULL, '兼职', 'parttime', 2, 4),
|
||
(NULL, '其他', 'other', 2, 5);
|
||
|
||
-- AI 会话表
|
||
CREATE TABLE IF NOT EXISTS `chat_session` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '会话ID',
|
||
`user_id` BIGINT NOT NULL COMMENT '用户ID',
|
||
`title` VARCHAR(100) NOT NULL DEFAULT '新对话' COMMENT '标题(首条消息自动生成)',
|
||
`deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0正常 1已删除',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最近活跃时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_user_updated` (`user_id`, `deleted`, `update_time`),
|
||
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI会话表';
|
||
|
||
-- AI 消息表(工具调用的中间过程不入库,历史里只有 user / assistant 文本)
|
||
CREATE TABLE IF NOT EXISTS `chat_message` (
|
||
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '消息ID',
|
||
`session_id` BIGINT NOT NULL COMMENT '会话ID',
|
||
`role` VARCHAR(16) NOT NULL COMMENT '角色:user / assistant',
|
||
`content` TEXT NOT NULL COMMENT '消息文本',
|
||
`deleted` TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除:0正常 1已删除',
|
||
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
PRIMARY KEY (`id`),
|
||
INDEX `idx_session_created` (`session_id`, `deleted`, `create_time`),
|
||
FOREIGN KEY (`session_id`) REFERENCES `chat_session` (`id`) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AI消息表';
|