-- Core schema. All business tables include deleted_at for GoFrame automatic soft deletion. CREATE TABLE IF NOT EXISTS user ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, union_id VARCHAR(64) NOT NULL DEFAULT '', open_id VARCHAR(64) NOT NULL DEFAULT '', mobile VARCHAR(20) NOT NULL DEFAULT '', account VARCHAR(64) NOT NULL DEFAULT '', password_hash VARCHAR(100) NOT NULL DEFAULT '', nickname VARCHAR(64) NOT NULL DEFAULT '', avatar VARCHAR(512) NOT NULL DEFAULT '', status TINYINT NOT NULL DEFAULT 1, last_login_at DATETIME NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, deleted_at DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY uk_user_open_id (open_id), UNIQUE KEY uk_user_mobile (mobile), UNIQUE KEY uk_user_account (account), KEY idx_user_status_created (status, created_at), KEY idx_user_deleted_at (deleted_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='C-end user'; CREATE TABLE IF NOT EXISTS admin_user ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(64) NOT NULL, password_hash VARCHAR(100) NOT NULL, nickname VARCHAR(64) NOT NULL DEFAULT '', status TINYINT NOT NULL DEFAULT 1, last_login_at DATETIME NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, deleted_at DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY uk_admin_username (username), KEY idx_admin_status (status), KEY idx_admin_deleted_at (deleted_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Admin user'; CREATE TABLE IF NOT EXISTS admin_role ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, code VARCHAR(64) NOT NULL, name VARCHAR(64) NOT NULL, status TINYINT NOT NULL DEFAULT 1, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, deleted_at DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY uk_role_code (code), KEY idx_role_deleted_at (deleted_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='RBAC role'; CREATE TABLE IF NOT EXISTS admin_menu ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, parent_id BIGINT UNSIGNED NOT NULL DEFAULT 0, name VARCHAR(64) NOT NULL, type TINYINT NOT NULL COMMENT '1 menu,2 api', path VARCHAR(255) NOT NULL DEFAULT '', permission VARCHAR(128) NOT NULL DEFAULT '', sort INT NOT NULL DEFAULT 0, status TINYINT NOT NULL DEFAULT 1, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, deleted_at DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY uk_menu_permission (permission), KEY idx_menu_parent_sort (parent_id,sort), KEY idx_menu_deleted_at (deleted_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Menu and API permission'; CREATE TABLE IF NOT EXISTS admin_user_role ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, admin_user_id BIGINT UNSIGNED NOT NULL, role_id BIGINT UNSIGNED NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, deleted_at DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY uk_user_role (admin_user_id,role_id), KEY idx_aur_role (role_id), KEY idx_aur_deleted_at (deleted_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Admin-role relation'; CREATE TABLE IF NOT EXISTS admin_role_menu ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, role_id BIGINT UNSIGNED NOT NULL, menu_id BIGINT UNSIGNED NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, deleted_at DATETIME NULL, PRIMARY KEY (id), UNIQUE KEY uk_role_menu (role_id,menu_id), KEY idx_arm_menu (menu_id), KEY idx_arm_deleted_at (deleted_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Role-menu relation'; CREATE TABLE IF NOT EXISTS admin_operation_log ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, admin_user_id BIGINT UNSIGNED NOT NULL COMMENT '管理员ID', admin_username VARCHAR(64) NOT NULL DEFAULT '' COMMENT '管理员账号(冗余,便于检索与展示)', permission VARCHAR(128) NOT NULL DEFAULT '' COMMENT '权限码', method VARCHAR(12) NOT NULL COMMENT 'HTTP 方法', path VARCHAR(255) NOT NULL COMMENT '请求路径', ip VARCHAR(64) NOT NULL DEFAULT '' COMMENT '来源 IP', ip_location VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'IP 归属地(省/市/运营商,离线解析)', request_param JSON NULL COMMENT '请求参数(敏感字段已脱敏)', duration_ms INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '耗时(ms)', status_code INT NOT NULL DEFAULT 0 COMMENT 'HTTP 状态码', error_message VARCHAR(512) NULL COMMENT '失败原因摘要', user_agent VARCHAR(512) NOT NULL DEFAULT '' COMMENT '浏览器 UA', created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, deleted_at DATETIME NULL, PRIMARY KEY (id), KEY idx_aol_user_created (admin_user_id,created_at), KEY idx_aol_permission_created (permission,created_at), KEY idx_aol_ip (ip), KEY idx_aol_username (admin_username), KEY idx_aol_deleted_at (deleted_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Admin operation audit log';