72 lines
3.1 KiB
SQL
72 lines
3.1 KiB
SQL
CREATE TABLE IF NOT EXISTS admins (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
username VARCHAR(80) NOT NULL UNIQUE,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
display_name VARCHAR(100) NOT NULL,
|
|
is_active TINYINT(1) NOT NULL DEFAULT 1,
|
|
failed_attempts TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
locked_until DATETIME NULL,
|
|
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
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS posts (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
title VARCHAR(200) NOT NULL,
|
|
slug VARCHAR(220) NOT NULL UNIQUE,
|
|
category VARCHAR(50) NOT NULL,
|
|
excerpt VARCHAR(500) NOT NULL DEFAULT '',
|
|
body MEDIUMTEXT NOT NULL,
|
|
author VARCHAR(100) NOT NULL DEFAULT '(주)지티에스정보통신',
|
|
status ENUM('draft', 'published') NOT NULL DEFAULT 'draft',
|
|
published_at DATETIME NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
deleted_at DATETIME NULL,
|
|
INDEX idx_posts_public (status, published_at, deleted_at),
|
|
INDEX idx_posts_category (category)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS post_images (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
post_id BIGINT UNSIGNED NOT NULL,
|
|
file_path VARCHAR(500) NOT NULL,
|
|
alt_text VARCHAR(255) NOT NULL DEFAULT '',
|
|
caption VARCHAR(500) NOT NULL DEFAULT '',
|
|
sort_order SMALLINT UNSIGNED NOT NULL DEFAULT 0,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_post_images_post FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
|
|
INDEX idx_post_images_order (post_id, sort_order)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS inquiries (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
ticket VARCHAR(32) NOT NULL UNIQUE,
|
|
name VARCHAR(120) NOT NULL,
|
|
phone VARCHAR(30) NOT NULL,
|
|
email VARCHAR(190) NULL,
|
|
inquiry_type VARCHAR(60) NOT NULL,
|
|
title VARCHAR(200) NOT NULL,
|
|
body TEXT NOT NULL,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
status ENUM('pending', 'in_progress', 'replied', 'closed') NOT NULL DEFAULT 'pending',
|
|
reply TEXT NULL,
|
|
replied_at DATETIME NULL,
|
|
closed_at DATETIME NULL,
|
|
lookup_failed_attempts TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
lookup_locked_until DATETIME NULL,
|
|
consent_at DATETIME NOT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
deleted_at DATETIME NULL,
|
|
INDEX idx_inquiries_status (status, created_at),
|
|
INDEX idx_inquiries_retention (closed_at, deleted_at)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
|
|
CREATE TABLE IF NOT EXISTS site_settings (
|
|
setting_key VARCHAR(100) PRIMARY KEY,
|
|
setting_value TEXT NOT NULL,
|
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|