SET NAMES utf8mb4; CREATE TABLE IF NOT EXISTS users ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, public_id VARCHAR(20) NOT NULL, country_code VARCHAR(8) NOT NULL DEFAULT '+86', phone_hash BINARY(32) NULL, phone_cipher VARBINARY(255) NULL, password_hash VARCHAR(255) NOT NULL, status TINYINT UNSIGNED NOT NULL DEFAULT 1, risk_level TINYINT UNSIGNED NOT NULL DEFAULT 0, 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), deleted_at DATETIME(3) NULL, PRIMARY KEY (id), UNIQUE KEY uk_users_public_id (public_id), UNIQUE KEY uk_users_phone_hash (phone_hash), KEY idx_users_status_created (status, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_profiles ( user_id BIGINT UNSIGNED NOT NULL, nickname VARCHAR(50) NOT NULL, avatar_url VARCHAR(500) NOT NULL DEFAULT '', cover_url VARCHAR(500) NOT NULL DEFAULT '', gender TINYINT UNSIGNED NOT NULL DEFAULT 0, birthday DATE NULL, height_cm SMALLINT UNSIGNED NULL, city_code VARCHAR(20) NOT NULL DEFAULT '', city_name VARCHAR(50) NOT NULL DEFAULT '', occupation VARCHAR(100) NOT NULL DEFAULT '', education TINYINT UNSIGNED NOT NULL DEFAULT 0, relationship_status TINYINT UNSIGNED NOT NULL DEFAULT 0, bio VARCHAR(500) NOT NULL DEFAULT '', profile_score SMALLINT UNSIGNED NOT NULL DEFAULT 0, is_vip TINYINT UNSIGNED NOT NULL DEFAULT 0, vip_level TINYINT UNSIGNED NOT NULL DEFAULT 0, last_active_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 (user_id), KEY idx_profiles_city_active (city_code, last_active_at), CONSTRAINT fk_profiles_user FOREIGN KEY (user_id) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_privacy_settings ( user_id BIGINT UNSIGNED NOT NULL, nearby_visible TINYINT(1) NOT NULL DEFAULT 1, distance_visible TINYINT(1) NOT NULL DEFAULT 1, online_visible TINYINT(1) NOT NULL DEFAULT 1, last_active_visible TINYINT(1) NOT NULL DEFAULT 1, allow_stranger_message TINYINT(1) NOT NULL DEFAULT 1, allow_profile_visit_record TINYINT(1) NOT NULL DEFAULT 1, allow_search TINYINT(1) NOT NULL DEFAULT 1, 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 (user_id), CONSTRAINT fk_privacy_user FOREIGN KEY (user_id) REFERENCES users(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_devices ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, device_id VARCHAR(100) NOT NULL, platform VARCHAR(20) NOT NULL, device_model VARCHAR(100) NOT NULL DEFAULT '', os_version VARCHAR(50) NOT NULL DEFAULT '', app_version VARCHAR(30) NOT NULL DEFAULT '', push_provider VARCHAR(30) NOT NULL DEFAULT '', push_token VARCHAR(255) NOT NULL DEFAULT '', last_ip VARCHAR(45) NOT NULL DEFAULT '', last_active_at DATETIME(3) NULL, status TINYINT UNSIGNED NOT NULL DEFAULT 1, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_device_user_device (user_id, device_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_sessions ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, device_id VARCHAR(100) NOT NULL, refresh_token_hash BINARY(32) NOT NULL, expires_at DATETIME(3) NOT NULL, last_active_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), revoked_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), KEY idx_sessions_user (user_id, revoked_at), UNIQUE KEY uk_sessions_refresh (refresh_token_hash) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS tags ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, category VARCHAR(30) NOT NULL, name VARCHAR(50) NOT NULL, icon VARCHAR(100) NOT NULL DEFAULT '', status TINYINT UNSIGNED NOT NULL DEFAULT 1, sort_order INT NOT NULL DEFAULT 0, PRIMARY KEY (id), UNIQUE KEY uk_tags_category_name (category, name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS user_tags ( user_id BIGINT UNSIGNED NOT NULL, tag_id BIGINT UNSIGNED NOT NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (user_id, tag_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE IF NOT EXISTS admin_users ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL, password_hash VARCHAR(255) NOT NULL, real_name VARCHAR(50) NOT NULL DEFAULT '', avatar_url VARCHAR(500) NOT NULL DEFAULT '', status TINYINT UNSIGNED NOT NULL DEFAULT 1, last_login_at DATETIME(3) NULL, created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), UNIQUE KEY uk_admin_username (username) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;