SET NAMES utf8mb4; CREATE TABLE IF NOT EXISTS user_oauth_identities ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, provider VARCHAR(20) NOT NULL, subject VARCHAR(191) NOT NULL, user_id BIGINT UNSIGNED NOT NULL, email VARCHAR(255) NOT NULL DEFAULT '', display_name VARCHAR(100) NOT NULL DEFAULT '', avatar_url VARCHAR(500) NOT NULL DEFAULT '', last_login_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_user_oauth_provider_subject (provider, subject), UNIQUE KEY uk_user_oauth_user_provider (user_id, provider), CONSTRAINT fk_user_oauth_identity_user FOREIGN KEY (user_id) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_oauth_states ( state_hash BINARY(32) NOT NULL, provider VARCHAR(20) NOT NULL, code_verifier VARCHAR(128) NOT NULL DEFAULT '', expires_at DATETIME(3) NOT NULL, used_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (state_hash), KEY idx_user_oauth_state_expiry (expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_oauth_login_codes ( code_hash BINARY(32) NOT NULL, provider VARCHAR(20) NOT NULL, subject VARCHAR(191) NOT NULL, email VARCHAR(255) NOT NULL DEFAULT '', display_name VARCHAR(100) NOT NULL DEFAULT '', avatar_url VARCHAR(500) NOT NULL DEFAULT '', user_id BIGINT UNSIGNED NULL, expires_at DATETIME(3) NOT NULL, used_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (code_hash), KEY idx_user_oauth_code_expiry (expires_at), KEY idx_user_oauth_code_user (user_id), CONSTRAINT fk_user_oauth_code_user FOREIGN KEY (user_id) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; INSERT INTO system_configs (config_key, config_value, value_type, description) VALUES ('oauth.user.frontend_callback_url', 'http://localhost:5174/#/pages/auth/oauth-callback', 'string', '第三方登录完成后跳转的 uni-app H5 页面;生产环境必须使用 HTTPS'), ('oauth.user.wechat.enabled', 'false', 'boolean', '在客户端启用微信登录'), ('oauth.user.qq.enabled', 'false', 'boolean', '在客户端启用 QQ 登录'), ('oauth.user.github.enabled', 'false', 'boolean', '在客户端启用 GitHub 登录'), ('oauth.user.google.enabled', 'false', 'boolean', '在客户端启用 Google 登录') ON DUPLICATE KEY UPDATE description = VALUES(description);