feat(system): 新增操作日志表与 V2 迁移

需求 2.5.1 要求记录用户管理操作,先落表结构:

- operation_logs 表:冗余 username 保证账号删除后仍可追溯,
  user_id 外键 ON DELETE SET NULL,success 默认 '0' 与 login_logs 口径一致
- 截断常量(USERNAME/ERROR_MESSAGE/REQUEST_DATA)集中定义,供写入方引用
- 修复既有 V1 迁移与迁移模板的 downgrade:索引是外键唯一支撑索引,
  先 drop_index 会报 errno 1553,改为只 drop_table
- 同步 db/migration/V2 与 init-dev.sql,迁移版本号更新为 a45a8087831b

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
liuwenxinandClaude Code committed 2026-10-10 10:44:05 +08:00
1 parent 273ebf4657
commit ad5fe4a411
9 files changed
+365 -30

No files matched your search

+32
View File
@@ -0,0 +1,32 @@
-- Running upgrade 6165691326d4 -> a45a8087831b
CREATE TABLE operation_logs (
id BIGINT UNSIGNED NOT NULL COMMENT '主键ID' AUTO_INCREMENT,
user_id BIGINT UNSIGNED COMMENT '操作人ID(账号删除后置空)',
username VARCHAR(64) NOT NULL COMMENT '操作人用户名(冗余存储便于追溯)',
module VARCHAR(64) NOT NULL COMMENT '所属模块,如 用户管理',
action VARCHAR(32) NOT NULL COMMENT '操作类型:新增/修改/删除/导出',
summary VARCHAR(255) NOT NULL COMMENT '操作摘要(中文,供人阅读)',
method VARCHAR(8) COMMENT 'HTTP 方法',
path VARCHAR(255) COMMENT '请求路径',
ip VARCHAR(45) COMMENT '客户端IP(45位兼容IPv6)',
user_agent VARCHAR(255) COMMENT '客户端User-Agent(截断存储)',
request_data TEXT COMMENT '请求参数(已脱敏)',
success TINYINT NOT NULL COMMENT '是否成功:1成功 0失败' DEFAULT '0',
error_message VARCHAR(500) COMMENT '失败原因(写入方须截断)',
duration_ms INTEGER COMMENT '处理耗时(毫秒)',
create_time DATETIME NOT NULL COMMENT '创建时间' DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT pk_operation_logs PRIMARY KEY (id),
CONSTRAINT fk_operation_logs_user_id FOREIGN KEY(user_id) REFERENCES users (id) ON DELETE SET NULL
)CHARSET=utf8mb4 ENGINE=InnoDB COMMENT='操作日志表' COLLATE utf8mb4_general_ci;
CREATE INDEX idx_operation_logs_create_time ON operation_logs (create_time);
CREATE INDEX idx_operation_logs_module ON operation_logs (module);
CREATE INDEX idx_operation_logs_user_id ON operation_logs (user_id);
CREATE INDEX idx_operation_logs_username ON operation_logs (username);
UPDATE alembic_version SET version_num='a45a8087831b' WHERE alembic_version.version_num = '6165691326d4';