feat: 新增标签体系、微信账单导入与收支记录体验优化

- 标签:新增 t_tag / t_transaction_tag 表与标签 CRUD,支持交易打标签、按标签筛选、批量添加/移除标签、导入账单默认标签,新增标签管理页
- 账单导入:新增微信支付 xlsx 解析器(WechatBillParser),支持支付宝 / 微信按类型导入;解析行保存原始完整数据(raw_data)并可在列表查看
- 收支记录:排序移至顶部并改为服务端排序(交易时间 / 金额,记忆偏好);筛选条件收纳为「更多筛选」弹层;分类筛选显示图标;一键设置支持「计入统计」;导入预览支持关键字 / 类型 / 状态 / 金额筛选
- 数据库:init.sql 新增 raw_data 字段与标签表,新增 init_tags.sql 默认标签种子
- 其他:更新 README 测试账号
This commit is contained in:
2026-09-17 16:47:26 +08:00
parent 1df6e23510
commit 65c0d8c550
33 changed files with 1854 additions and 100 deletions
+23
View File
@@ -34,6 +34,7 @@ CREATE TABLE IF NOT EXISTS t_transaction (
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索引',
@@ -42,3 +43,25 @@ CREATE TABLE IF NOT EXISTS t_transaction (
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索引'
);
+38
View File
@@ -0,0 +1,38 @@
-- 初始化默认标签种子脚本
-- 用途:为现有用户补齐一套通用标签
-- 特性:幂等,按「用户ID + 标签名称」去重,可重复执行
-- 编码:utf8mb4
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_default_tag (
name VARCHAR(50) NOT NULL,
color VARCHAR(20),
sort_order INT NOT NULL
);
DELETE FROM tmp_default_tag;
INSERT INTO tmp_default_tag (name, color, sort_order) VALUES
('报销', '#2080f0', 10),
('待报销', '#f0a020', 20),
('旅行', '#18a058', 30),
('家庭', '#8a2be2', 40),
('工作', '#d03050', 50),
('学习', '#0ea5e9', 60),
('医疗', '#e11d48', 70),
('大额消费', '#f97316', 80),
('订阅', '#7c3aed', 90),
('礼物', '#ec4899', 100),
('投资', '#16a34a', 110),
('宠物', '#a16207', 120),
('电影', '#14b8a6', 130);
INSERT INTO t_tag (user_id, name, color, sort_order)
SELECT u.id, d.name, d.color, d.sort_order
FROM t_user u
JOIN tmp_default_tag d
WHERE NOT EXISTS (
SELECT 1 FROM t_tag t
WHERE t.user_id = u.id AND t.name = d.name
);
DROP TEMPORARY TABLE IF EXISTS tmp_default_tag;