feat: 用户级偏好配置与外观设置,枚举统一抽取与账单类型后端下发

- 新增用户偏好表 t_user_preference 与进程内缓存,账单来源统计默认值由全局改为按用户存储(/api/setting)
- 新增外观设置:不计入统计记录支持删除线与灰色标签两种展示样式
- 抽取 ChannelType / TransactionType / StatisticsScope 枚举,替换各处硬编码的渠道、类型与统计口径
- BillType 内聚各来源扩展名,新增 /transaction/import/types 接口,前端改为按后端下发渲染
- 仪表盘趋势图支持点击柱子跳转收支记录并带入筛选条件
- 布局内容区按路由记忆滚动位置;已登录访问登录/注册页自动跳转
This commit is contained in:
2026-09-21 10:51:15 +08:00
parent 2976b85967
commit 1f520f4376
46 changed files with 1565 additions and 284 deletions
+11
View File
@@ -260,3 +260,14 @@ CREATE TABLE IF NOT EXISTS t_email_bill_message (
UNIQUE INDEX uk_email_bill_message (config_id, uid, attachment_index) COMMENT '配置+UID+附件序号唯一索引,用于去重',
INDEX idx_email_bill_message_user_status (user_id, status) COMMENT '用户ID+状态联合索引'
);
-- 用户偏好表:按用户存储键值形式的偏好配置
CREATE TABLE IF NOT EXISTS t_user_preference (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '偏好ID,主键自增',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
user_id BIGINT NOT NULL COMMENT '所属用户ID',
pref_key VARCHAR(50) NOT NULL COMMENT '偏好键,如 billSourceIncludeInStats / excludedDisplayStyle',
pref_value TEXT COMMENT '偏好值,标量字符串或 JSON',
UNIQUE INDEX uk_user_pref (user_id, pref_key) COMMENT '用户+偏好键唯一索引'
);
+18
View File
@@ -325,3 +325,21 @@ WHEN NEW.updated_at = OLD.updated_at
BEGIN
UPDATE t_email_bill_message SET updated_at = strftime('%Y-%m-%dT%H:%M:%S', 'now', 'localtime') WHERE id = OLD.id;
END;;
CREATE TABLE IF NOT EXISTS t_user_preference (
id INTEGER PRIMARY KEY AUTOINCREMENT,
created_at DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%S', 'now', 'localtime')),
updated_at DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%S', 'now', 'localtime')),
user_id INTEGER NOT NULL,
pref_key VARCHAR(50) NOT NULL,
pref_value TEXT
);;
CREATE UNIQUE INDEX IF NOT EXISTS uk_user_pref ON t_user_preference (user_id, pref_key);;
CREATE TRIGGER IF NOT EXISTS trg_user_preference_updated_at
AFTER UPDATE ON t_user_preference
FOR EACH ROW
WHEN NEW.updated_at = OLD.updated_at
BEGIN
UPDATE t_user_preference SET updated_at = strftime('%Y-%m-%dT%H:%M:%S', 'now', 'localtime') WHERE id = OLD.id;
END;;