feat: GTSIT 사이트 구축
This commit is contained in:
8
database/migrate-20260805-inquiry-pin.sql
Normal file
8
database/migrate-20260805-inquiry-pin.sql
Normal file
@@ -0,0 +1,8 @@
|
||||
ALTER TABLE inquiries
|
||||
ADD COLUMN IF NOT EXISTS closed_at DATETIME NULL AFTER replied_at,
|
||||
ADD COLUMN IF NOT EXISTS lookup_failed_attempts TINYINT UNSIGNED NOT NULL DEFAULT 0 AFTER closed_at,
|
||||
ADD COLUMN IF NOT EXISTS lookup_locked_until DATETIME NULL AFTER lookup_failed_attempts;
|
||||
|
||||
ALTER TABLE inquiries
|
||||
DROP INDEX IF EXISTS idx_inquiries_retention,
|
||||
ADD INDEX idx_inquiries_retention (closed_at, deleted_at);
|
||||
71
database/schema.sql
Normal file
71
database/schema.sql
Normal file
@@ -0,0 +1,71 @@
|
||||
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;
|
||||
10
database/seed-drafts.sql
Normal file
10
database/seed-drafts.sql
Normal file
@@ -0,0 +1,10 @@
|
||||
INSERT IGNORE INTO posts (title, slug, category, excerpt, body, author, status, published_at) VALUES
|
||||
('사무실 이전 시 네트워크 구축 체크리스트','office-network-move-checklist','네트워크','인터넷 회선 이전부터 배선 경로와 장비 배치까지 이사 전에 확인할 항목입니다.','사무실 이전 2~3주 전에는 인터넷 회선 이전 또는 신규 가입 일정을 먼저 확인해야 합니다.\n\n좌석 배치도를 기준으로 유선 포트 수와 무선 AP 위치, 통신 단자함의 위치를 함께 점검하면 시공 당일 혼선을 줄일 수 있습니다.','(주)지티에스정보통신','draft',NULL),
|
||||
('LG vs 삼성 키폰 주장치, 어떻게 고를까?','lg-vs-samsung-keyphone-guide','키폰시스템','내선 규모와 확장성, 부가 기능을 기준으로 키폰 주장치 선택 기준을 안내합니다.','키폰 주장치는 현재 회선 수뿐 아니라 향후 증설 가능성을 고려해 선택해야 합니다.\n\n사용 인원과 통화 패턴, 일반 전화기 혼용 여부를 확인한 뒤 환경에 맞는 구성을 결정하는 것이 좋습니다.','(주)지티에스정보통신','draft',NULL),
|
||||
('물류창고 100회선 키폰과 네트워크 통합 시공기','warehouse-network-keyphone-case','시공사례','넓은 현장의 배선 설계와 무선 구간 보강을 함께 진행한 통합 시공 사례입니다.','대형 물류창고는 높은 천장과 넓은 면적을 고려한 배선 설계가 필요합니다.\n\n구역별 스위치 분산과 무선 AP 채널 설계를 통해 안정성과 유지보수 편의성을 함께 확보했습니다.','(주)지티에스정보통신','draft',NULL),
|
||||
('유선랜 vs 무선랜, 사무실 환경별 선택 가이드','wired-vs-wireless-office-guide','네트워크','좌석 밀도와 보안 요구에 따라 유선과 무선을 구성하는 기준을 정리했습니다.','유선랜과 무선랜은 대체 관계보다 보완 관계에 가깝습니다.\n\n고정 좌석과 대용량 업무에는 유선을, 회의실과 공용 공간에는 무선을 배치해 안정성과 이동성을 함께 확보합니다.','(주)지티에스정보통신','draft',NULL),
|
||||
('CCTV 화소수와 저장기간, 적정 기준은?','cctv-resolution-storage-guide','CCTV','현장 목적에 맞는 해상도와 녹화 보관 일수를 선택하는 기준입니다.','CCTV는 설치 목적과 촬영 거리에 맞는 해상도를 선택해야 합니다.\n\n얼굴이나 번호판 식별이 필요한 위치와 전체 동선 확인이 필요한 위치를 구분하면 저장 용량과 비용을 효율적으로 구성할 수 있습니다.','(주)지티에스정보통신','draft',NULL),
|
||||
('인터넷 속도 저하, 스위치 점검으로 해결한 사례','network-switch-troubleshooting-case','시공사례','내부 네트워크 장비 점검으로 반복되는 속도 저하를 해결한 사례입니다.','인터넷 속도 저하는 통신사 회선뿐 아니라 내부 스위치와 배선에서도 발생할 수 있습니다.\n\n구간별 측정과 장비 점검을 통해 원인을 찾고 필요한 장비만 교체하는 것이 중요합니다.','(주)지티에스정보통신','draft',NULL),
|
||||
('하이브리드 근무를 위한 사무실 무선랜 설계','hybrid-office-wifi-design','네트워크','동시 접속자 증가에 대비한 AP 수량과 채널 설계 방법입니다.','안정적인 무선 환경을 위해서는 신호 세기뿐 아니라 동시 접속 부하를 분산해야 합니다.\n\n회의실처럼 사용자가 몰리는 공간은 별도 용량을 확보하고 인접 AP의 채널 간섭을 줄입니다.','(주)지티에스정보통신','draft',NULL),
|
||||
('노후 키폰 교체, 비용을 줄이는 하이브리드 구성','keyphone-hybrid-replacement-guide','키폰시스템','키폰과 일반 전화기를 함께 사용해 교체 비용을 낮추는 구성입니다.','통화량이 많은 자리에는 기능형 키폰을 배치하고 통화가 적은 공간에는 일반 전화기를 사용할 수 있습니다.\n\n자리별 사용 패턴을 기준으로 교체 범위를 정하면 초기 비용을 줄일 수 있습니다.','(주)지티에스정보통신','draft',NULL),
|
||||
('다지점 매장 CCTV 통합 관제 구축 사례','multi-store-cctv-monitoring-case','CCTV','여러 지점의 영상을 본사에서 확인할 수 있도록 구성한 통합 관제 사례입니다.','지점별 녹화장치와 본사 관제 환경을 연결할 때는 접근 권한과 외부 노출을 함께 고려해야 합니다.\n\n지점 확장 계획을 반영해 처음부터 확장 가능한 구조로 설계하는 것이 좋습니다.','(주)지티에스정보통신','draft',NULL);
|
||||
87
database/seed-legacy-content.sql
Normal file
87
database/seed-legacy-content.sql
Normal file
@@ -0,0 +1,87 @@
|
||||
SET NAMES utf8mb4;
|
||||
START TRANSACTION;
|
||||
|
||||
INSERT INTO posts (title, slug, category, excerpt, body, author, status, published_at) VALUES
|
||||
(
|
||||
'사무실 LAN 구축, 구조와 배선 설계부터 확인하세요',
|
||||
'office-lan-structure-cabling-guide',
|
||||
'네트워크',
|
||||
'사무실 LAN을 안정적으로 운영하려면 좌석 수뿐 아니라 배선 구조, 통신실 위치, 장비 확장성까지 함께 설계해야 합니다.',
|
||||
'LAN은 한정된 공간의 컴퓨터와 장비가 데이터를 주고받도록 구성하는 네트워크입니다. 사무실에서는 인터넷 연결뿐 아니라 프린터, 전화, CCTV, 업무 서버 등 여러 장비가 같은 통신 기반을 사용하므로 처음 배선할 때 전체 구조를 함께 살펴야 합니다.\n\n일반적인 사무실은 중앙 통신실의 스위치를 기준으로 각 좌석과 장비를 개별 연결하는 스타형 구성이 관리하기 편합니다. 한 구간에 장애가 생겨도 다른 좌석으로 영향이 번지는 범위를 줄일 수 있고, 포트 추가와 문제 구간 확인도 비교적 수월합니다.\n\n배선 공사 전에는 좌석 배치도, 회의실과 복합기 위치, 무선 AP와 CCTV 설치 지점, 향후 증원 계획을 확인합니다. 현재 필요한 포트 수에만 맞추기보다 예비 회선과 랙 공간을 확보하면 자리 이동이나 장비 증설 때 재시공을 줄일 수 있습니다.\n\n시공 후에는 패치패널과 스위치 포트, 벽면 아웃렛에 같은 번호 체계를 적용하는 것이 중요합니다. 배선 라벨과 연결 정보를 남겨두면 장애 점검 시간이 짧아지고 유지보수 담당자가 바뀌어도 구조를 빠르게 파악할 수 있습니다.',
|
||||
'(주)지티에스정보통신',
|
||||
'published',
|
||||
'2026-08-05 09:00:00'
|
||||
),
|
||||
(
|
||||
'옥외 무선 통신 구간 설치 시 확인할 사항',
|
||||
'outdoor-wireless-link-installation-guide',
|
||||
'네트워크',
|
||||
'건물 간 옥외 무선 구간은 가시거리, 고정 방식, 전원과 배선 보호, 접속 보안을 함께 검토해야 안정적으로 운영할 수 있습니다.',
|
||||
'케이블을 직접 포설하기 어려운 건물 간 구간이나 넓은 외부 공간에서는 옥외 무선 장비를 활용할 수 있습니다. 장비 사양만으로 결정하기보다 두 지점 사이의 거리와 장애물, 설치 높이, 주변 전파 환경을 먼저 확인해야 합니다.\n\n안정적인 통신을 위해서는 송수신 장비 사이의 가시거리를 확보하고 바람이나 진동에도 방향이 틀어지지 않도록 견고하게 고정해야 합니다. 옥외에 노출되는 전원과 통신 배선은 방수 처리와 낙뢰·서지 보호도 함께 검토합니다.\n\n무선 구간은 편리하지만 접속 권한과 암호화 설정이 빠지면 보안 위험이 생길 수 있습니다. 사용 장비가 지원하는 최신 암호화 방식을 적용하고 관리 계정과 비밀번호를 기본값에서 변경하며, 업무망과 방문자망은 용도에 따라 분리하는 편이 안전합니다.\n\n설치가 끝난 뒤에는 실제 사용 위치에서 속도와 지연, 끊김 여부를 확인합니다. 정기 점검 시에는 장비 고정 상태와 케이블 피복, 방수 부위, 신호 품질 변화를 함께 살펴야 장기적인 장애를 예방할 수 있습니다.',
|
||||
'(주)지티에스정보통신',
|
||||
'published',
|
||||
'2026-08-04 09:00:00'
|
||||
),
|
||||
(
|
||||
'키폰시스템 주장치 선택, 증설 용량이 중요합니다',
|
||||
'keyphone-system-capacity-selection',
|
||||
'키폰시스템',
|
||||
'키폰 주장치는 현재 사용하는 국선과 내선뿐 아니라 향후 인원 증가, 일반 전화기 혼용, 부가 기능까지 고려해 선택해야 합니다.',
|
||||
'키폰시스템은 여러 전화번호와 내선을 사업장 구성원들이 효율적으로 사용하고, 걸려온 전화를 필요한 자리로 연결하는 업무용 통신 시스템입니다. 일반적으로 주장치, 키폰 전화기, 연결 선로와 운영에 필요한 부가 장비로 구성됩니다.\n\n주장치를 선택할 때는 현재 사용 중인 전화기 수만 확인해서는 부족합니다. 외부에서 들어오는 국선 수, 필요한 내선 수, 부서 이동과 인원 증가 가능성, 안내방송이나 녹취 같은 부가 기능을 함께 정리해야 합니다. 최대 수용 용량이 부족하면 증설 시 주장치 전체를 교체해야 할 수 있습니다.\n\n모든 자리에 기능형 키폰 전화기가 필요한 것도 아닙니다. 통화량이 많은 안내 데스크와 주요 부서에는 기능형 전화기를 배치하고, 창고나 휴게실처럼 통화가 적은 공간에는 일반 전화기를 혼용할 수 있는지 확인하면 초기 비용을 조절할 수 있습니다.\n\n설치 전에는 기존 배선 재사용 가능 여부와 통신 랙 공간, 정전 시 운영 방식도 점검합니다. 현재 규모와 향후 계획을 함께 알려주시면 필요한 용량을 과도하게 늘리지 않으면서도 확장 가능한 구성을 제안할 수 있습니다.',
|
||||
'(주)지티에스정보통신',
|
||||
'published',
|
||||
'2026-08-03 09:00:00'
|
||||
),
|
||||
(
|
||||
'CCTV 녹화장치 구성 시 꼭 확인할 기능',
|
||||
'cctv-recorder-essential-features',
|
||||
'CCTV',
|
||||
'CCTV 녹화장치는 카메라 수와 화질 외에도 움직임 감지, 예약 녹화, 원격 확인, 백업과 보관 정책을 확인해야 합니다.',
|
||||
'CCTV 시스템은 카메라 영상의 실시간 확인뿐 아니라 필요한 장면을 안정적으로 저장하고 다시 찾을 수 있어야 합니다. 녹화장치를 구성할 때는 카메라 대수와 해상도, 초당 프레임, 보관 기간을 기준으로 저장 용량을 계산합니다.\n\n움직임 감지 녹화는 변화가 있을 때 영상을 저장해 불필요한 구간을 줄이는 데 도움이 됩니다. 영업시간과 비영업시간을 구분한 예약 녹화, 움직임이나 센서 이벤트에 따른 알림 기능도 현장 운영 방식에 맞춰 설정할 수 있습니다.\n\n외부에서 영상을 확인해야 한다면 원격 접속 편의성만큼 보안 설정이 중요합니다. 불필요한 외부 노출을 줄이고 강한 비밀번호와 사용자별 권한을 적용하며, 운영에 필요한 범위에서만 접속을 허용해야 합니다.\n\n사고 확인이나 자료 제출에 대비해 특정 시간대 영상을 별도 저장하는 백업 절차도 점검합니다. 저장장치 장애 알림, 오래된 영상의 순환 삭제 방식, 실제 검색과 재생 속도까지 설치 후 검수해야 필요한 순간에 영상을 활용할 수 있습니다.',
|
||||
'(주)지티에스정보통신',
|
||||
'published',
|
||||
'2026-08-02 09:00:00'
|
||||
),
|
||||
(
|
||||
'통신실 랙 배선 정리가 유지보수를 좌우하는 이유',
|
||||
'network-rack-cabling-maintenance-case',
|
||||
'시공사례',
|
||||
'통신 랙 안의 장비와 배선을 용도별로 정리하고 포트에 라벨을 부여하면 장애 대응과 향후 증설이 쉬워집니다.',
|
||||
'통신실 랙은 인터넷 회선, 네트워크 스위치, 키폰 주장치와 패치패널 등 사업장의 주요 통신 장비가 모이는 공간입니다. 장비가 정상 동작하더라도 케이블이 뒤엉키고 연결 정보가 남아 있지 않으면 작은 장애도 확인하는 데 많은 시간이 걸립니다.\n\n랙을 정리할 때는 장비의 발열과 점검 공간을 고려해 위치를 정하고, 전원선과 통신선을 가능한 범위에서 구분합니다. 케이블 길이는 점검과 장비 교체에 필요한 여유를 남기되 통풍을 막거나 포트를 가리지 않도록 정리합니다.\n\n패치패널, 스위치 포트, 벽면 아웃렛에는 같은 번호 체계를 사용합니다. 포트별 사용 위치와 용도를 기록해 두면 어느 좌석과 장비가 연결되어 있는지 바로 확인할 수 있어 장애 구간 분리와 자리 이동이 빨라집니다.\n\n시공 완료 후에는 케이블 연결 상태와 링크 속도를 확인하고 랙 전면과 배선 상태를 기록합니다. 이렇게 정리된 기준은 이후 장비 추가나 유지보수 작업의 출발점이 되어 불필요한 재배선과 서비스 중단 시간을 줄여줍니다.',
|
||||
'(주)지티에스정보통신',
|
||||
'published',
|
||||
'2026-08-01 09:00:00'
|
||||
)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
title = VALUES(title),
|
||||
category = VALUES(category),
|
||||
excerpt = VALUES(excerpt),
|
||||
body = VALUES(body),
|
||||
author = VALUES(author),
|
||||
status = VALUES(status),
|
||||
published_at = VALUES(published_at),
|
||||
deleted_at = NULL;
|
||||
|
||||
DELETE post_images
|
||||
FROM post_images
|
||||
JOIN posts ON posts.id = post_images.post_id
|
||||
WHERE posts.slug IN (
|
||||
'office-lan-structure-cabling-guide',
|
||||
'outdoor-wireless-link-installation-guide',
|
||||
'keyphone-system-capacity-selection',
|
||||
'cctv-recorder-essential-features',
|
||||
'network-rack-cabling-maintenance-case'
|
||||
);
|
||||
|
||||
INSERT INTO post_images (post_id, file_path, alt_text, caption, sort_order)
|
||||
SELECT id, '/assets/images/field/lan-cabling-rack.jpg', '포트별로 정리하고 라벨링한 네트워크 배선 랙', '', 0 FROM posts WHERE slug = 'office-lan-structure-cabling-guide'
|
||||
UNION ALL
|
||||
SELECT id, '/assets/images/field/outdoor-wireless-link.jpg', '건물 옥상에 설치한 옥외 무선 통신 장비', '', 0 FROM posts WHERE slug = 'outdoor-wireless-link-installation-guide'
|
||||
UNION ALL
|
||||
SELECT id, '/assets/images/field/keyphone-network-rack.jpg', '키폰과 네트워크 장비를 구성한 통신 랙', '', 0 FROM posts WHERE slug = 'keyphone-system-capacity-selection'
|
||||
UNION ALL
|
||||
SELECT id, '/assets/images/field/cctv-control-rack.jpg', '여러 CCTV 화면을 확인하는 녹화장치와 관제 랙', '', 0 FROM posts WHERE slug = 'cctv-recorder-essential-features'
|
||||
UNION ALL
|
||||
SELECT id, '/assets/images/field/lan-cabling-rack.jpg', '정리된 패치패널과 네트워크 스위치 배선', '', 0 FROM posts WHERE slug = 'network-rack-cabling-maintenance-case';
|
||||
|
||||
COMMIT;
|
||||
Reference in New Issue
Block a user