CREATE TABLE users ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, phone VARCHAR(32) NOT NULL, nickname VARCHAR(64) NOT NULL DEFAULT '', avatar_url VARCHAR(512) NOT NULL DEFAULT '', realname_status VARCHAR(32) NOT NULL DEFAULT 'unverified', risk_status VARCHAR(32) NOT NULL DEFAULT 'normal', credit_score INT NOT NULL DEFAULT 100, status VARCHAR(32) NOT NULL DEFAULT 'active', last_login_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_users_phone (phone) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE user_realname ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, provider VARCHAR(32) NOT NULL, provider_order_no VARCHAR(128) NOT NULL DEFAULT '', status VARCHAR(32) NOT NULL DEFAULT 'pending', masked_name VARCHAR(64) NOT NULL DEFAULT '', masked_id_no VARCHAR(64) NOT NULL DEFAULT '', verified_at DATETIME NULL, fail_reason VARCHAR(255) NOT NULL DEFAULT '', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_user_realname_user_id (user_id), KEY idx_user_realname_provider_order_no (provider_order_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE game_accounts ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, owner_id BIGINT UNSIGNED NOT NULL, game_name VARCHAR(64) NOT NULL DEFAULT 'delta_force', server_region VARCHAR(64) NOT NULL, login_platform VARCHAR(64) NOT NULL, title VARCHAR(128) NOT NULL, description TEXT NULL, rank_level VARCHAR(64) NOT NULL DEFAULT '', haf_coin_amount BIGINT NOT NULL DEFAULT 0, asset_summary JSON NULL, season_tags JSON NULL, screenshot_urls JSON NULL, status VARCHAR(32) NOT NULL DEFAULT 'draft', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx_game_accounts_owner_id (owner_id), KEY idx_game_accounts_filter (game_name, server_region, login_platform) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE rental_listings ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, account_id BIGINT UNSIGNED NOT NULL, owner_id BIGINT UNSIGNED NOT NULL, price_hourly DECIMAL(12,2) NOT NULL DEFAULT 0.00, price_daily DECIMAL(12,2) NOT NULL DEFAULT 0.00, price_weekly DECIMAL(12,2) NOT NULL DEFAULT 0.00, deposit_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, status VARCHAR(32) NOT NULL DEFAULT 'draft', review_status VARCHAR(32) NOT NULL DEFAULT 'none', review_reason VARCHAR(255) NOT NULL DEFAULT '', published_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx_rental_listings_account_id (account_id), KEY idx_rental_listings_owner_id (owner_id), KEY idx_rental_listings_filter (status, review_status, price_hourly) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE rental_orders ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(64) NOT NULL, listing_id BIGINT UNSIGNED NOT NULL, account_id BIGINT UNSIGNED NOT NULL, owner_id BIGINT UNSIGNED NOT NULL, renter_id BIGINT UNSIGNED NOT NULL, rent_start_at DATETIME NULL, rent_end_at DATETIME NULL, rent_hours INT NOT NULL, rent_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, deposit_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, platform_fee DECIMAL(12,2) NOT NULL DEFAULT 0.00, account_snapshot JSON NULL, status VARCHAR(32) NOT NULL DEFAULT 'pending_confirm', handoff_status VARCHAR(32) NOT NULL DEFAULT 'none', settlement_status VARCHAR(32) NOT NULL DEFAULT 'unsettled', owner_settled_at DATETIME NULL, settled_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_rental_orders_order_no (order_no), KEY idx_rental_orders_renter_status (renter_id, status), KEY idx_rental_orders_owner_status (owner_id, status), KEY idx_rental_orders_listing_id (listing_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE handoff_records ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, order_id BIGINT UNSIGNED NOT NULL, from_user_id BIGINT UNSIGNED NOT NULL, to_user_id BIGINT UNSIGNED NOT NULL, type VARCHAR(32) NOT NULL, content TEXT NULL, attachment_urls JSON NULL, confirmed_by_renter_at DATETIME NULL, confirmed_by_owner_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_handoff_records_order_id (order_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE order_checkouts ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, order_id BIGINT UNSIGNED NOT NULL, initiated_by BIGINT UNSIGNED NOT NULL, status VARCHAR(32) NOT NULL DEFAULT 'submitted', rent_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, deposit_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, consumable_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, coin_consumed_m DECIMAL(12,2) NOT NULL DEFAULT 0.00, other_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, deposit_deduct_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, renter_refund_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, owner_income_amount DECIMAL(12,2) NOT NULL DEFAULT 0.00, content TEXT NULL, evidence_urls JSON NULL, owner_adjustment_reason TEXT NULL, owner_adjusted_at DATETIME NULL, renter_confirmed_at DATETIME NULL, renter_rejected_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx_order_checkouts_order_id (order_id), KEY idx_order_checkouts_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE wallet_accounts ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, available_balance DECIMAL(12,2) NOT NULL DEFAULT 0.00, frozen_balance DECIMAL(12,2) NOT NULL DEFAULT 0.00, status VARCHAR(32) NOT NULL DEFAULT 'active', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_wallet_accounts_user_id (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE wallet_ledger ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, ledger_no VARCHAR(64) NOT NULL, user_id BIGINT UNSIGNED NOT NULL, order_id BIGINT UNSIGNED NULL, direction VARCHAR(16) NOT NULL, amount DECIMAL(12,2) NOT NULL, balance_after DECIMAL(12,2) NOT NULL, balance_type VARCHAR(32) NOT NULL, biz_type VARCHAR(32) NOT NULL, biz_no VARCHAR(64) NOT NULL, remark VARCHAR(255) NOT NULL DEFAULT '', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_wallet_ledger_ledger_no (ledger_no), KEY idx_wallet_ledger_user_created (user_id, created_at), KEY idx_wallet_ledger_biz (biz_type, biz_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE disputes ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, order_id BIGINT UNSIGNED NOT NULL, initiator_id BIGINT UNSIGNED NOT NULL, target_user_id BIGINT UNSIGNED NOT NULL, type VARCHAR(32) NOT NULL, status VARCHAR(32) NOT NULL DEFAULT 'open', description TEXT NULL, evidence_urls JSON NULL, arbitration_result VARCHAR(32) NOT NULL DEFAULT '', arbitration_remark TEXT NULL, handled_by BIGINT UNSIGNED NULL, handled_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, KEY idx_disputes_order_id (order_id), KEY idx_disputes_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE notifications ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, type VARCHAR(32) NOT NULL, title VARCHAR(128) NOT NULL, content TEXT NULL, biz_type VARCHAR(32) NOT NULL DEFAULT '', biz_id BIGINT UNSIGNED NULL, read_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_notifications_user_read_created (user_id, read_at, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE audit_logs ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, actor_type VARCHAR(32) NOT NULL, actor_id BIGINT UNSIGNED NOT NULL, action VARCHAR(64) NOT NULL, biz_type VARCHAR(32) NOT NULL, biz_id BIGINT UNSIGNED NULL, ip VARCHAR(64) NOT NULL DEFAULT '', user_agent VARCHAR(512) NOT NULL DEFAULT '', detail JSON NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_audit_logs_actor_created (actor_id, created_at), KEY idx_audit_logs_biz (biz_type, biz_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE admin_users ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, username VARCHAR(64) NOT NULL, password_hash VARCHAR(255) NOT NULL, nickname VARCHAR(64) NOT NULL DEFAULT '', status VARCHAR(32) NOT NULL DEFAULT 'active', last_login_at DATETIME NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_admin_users_username (username) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE roles ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, code VARCHAR(64) NOT NULL, name VARCHAR(64) NOT NULL, description VARCHAR(255) NOT NULL DEFAULT '', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_roles_code (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE permissions ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, code VARCHAR(128) NOT NULL, name VARCHAR(64) NOT NULL, resource VARCHAR(128) NOT NULL, action VARCHAR(64) NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_permissions_code (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE admin_user_roles ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, admin_user_id BIGINT UNSIGNED NOT NULL, role_id BIGINT UNSIGNED NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_admin_user_roles_user_role (admin_user_id, role_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE role_permissions ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, role_id BIGINT UNSIGNED NOT NULL, permission_id BIGINT UNSIGNED NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_role_permissions_role_permission (role_id, permission_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE system_configs ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, `key` VARCHAR(128) NOT NULL, `value` TEXT NOT NULL, description VARCHAR(255) NOT NULL DEFAULT '', updated_by BIGINT UNSIGNED NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uk_system_configs_key (`key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;