Files
Aq-Accounting-Spring/src/main/resources/db/schema.sql
T
2026-09-24 14:27:12 +08:00

211 lines
11 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 创建数据库
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消息表';