📂 FileMgr
📍
/home/kientructhaiha/htdocs/kientructhaiha.com/backend
✏️ Edit File: /home/kientructhaiha/htdocs/kientructhaiha.com/backend/config.php
⬅ Kembali
<?php /** * Configuration - No Database Required * Data stored in files and embedded in code */ // Prevent multiple inclusions if (defined('CONFIG_LOADED')) { return; } define('CONFIG_LOADED', true); // Development: show all PHP errors (disable in production) error_reporting(E_ALL & ~E_WARNING); ini_set('display_errors', 0); // Site URL define('SITE_URL', 'http://kientructhaiha.com'); define('ADMIN_URL', SITE_URL . '/admin'); define('DB_HOST', 'localhost'); define('DB_USER', 'kientrucuser'); define('DB_PASS', 'Abc123456'); define('DB_NAME', 'kientrucdb'); $mysqli = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME); if ($mysqli->connect_errno) { die('Database connection failed: ' . $mysqli->connect_error); } $mysqli->set_charset('utf8mb4'); // Upload paths define('UPLOAD_DIR', __DIR__ . '/../assets/uploads/'); define('UPLOAD_URL', SITE_URL . '/assets/uploads/'); // Data storage paths define('DATA_DIR', __DIR__ . '/../data/'); define('CONSULTATIONS_FILE', DATA_DIR . 'consultations.json'); define('USERS_FILE', DATA_DIR . 'users.json'); define('PROJECTS_FILE', DATA_DIR . 'projects.json'); define('TEAM_FILE', DATA_DIR . 'team.json'); define('ABOUT_FILE', DATA_DIR . 'about.json'); // Session configuration define('SESSION_TIMEOUT', 1800); // 30 minutes // Ensure data directory exists if (!is_dir(DATA_DIR)) { mkdir(DATA_DIR, 0755, true); } // Initialize admin user if not exists if (!file_exists(USERS_FILE)) { $admin_user = [ [ 'id' => 1, 'username' => 'admin', 'password' => password_hash('admin123', PASSWORD_BCRYPT, ['cost' => 10]), 'email' => 'admin@thaihan.vn', 'full_name' => 'Admin User', 'role' => 'admin', 'status' => 1, 'created_at' => date('Y-m-d H:i:s') ] ]; file_put_contents(USERS_FILE, json_encode($admin_user, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); } // Initialize project data if not exists if (!file_exists(PROJECTS_FILE)) { $default_projects = [ [ 'id' => 1, 'title' => 'Villa Ốc đảo Đại dương', 'location' => 'Quảng Bình, Việt Nam', 'project_type' => 'villa', 'description' => 'Thiết kế biệt thự nghỉ dưỡng ven bờ biển với tầm nhìn hướng ra đại dương.', 'status' => 'published', 'featured_image' => 'assets/images/project-large.jpg', 'image_urls' => ['assets/images/project-large.jpg'], 'created_at' => date('Y-m-d H:i:s') ], [ 'id' => 2, 'title' => 'Phòng trưng bày L\'Elegance', 'location' => 'Showroom', 'project_type' => 'commercial', 'description' => 'Không gian giới thiệu sản phẩm và mẫu thiết kế sang trọng.', 'status' => 'published', 'featured_image' => 'assets/images/project-side-1.jpg', 'image_urls' => ['assets/images/project-side-1.jpg'], 'created_at' => date('Y-m-d H:i:s') ], [ 'id' => 3, 'title' => 'Nơi ẩn mình Skyline', 'location' => 'Penthouse', 'project_type' => 'residential', 'description' => 'Căn hộ penthouse với không gian mở và ánh sáng tự nhiên.', 'status' => 'published', 'featured_image' => 'assets/images/project-side-2.jpg', 'image_urls' => ['assets/images/project-side-2.jpg'], 'created_at' => date('Y-m-d H:i:s') ], [ 'id' => 4, 'title' => 'Nghỉ dưỡng ven rừng', 'location' => 'Villa', 'project_type' => 'residential', 'description' => 'Dự án villa nghỉ dưỡng giữa thiên nhiên xanh mát.', 'status' => 'published', 'featured_image' => 'assets/images/project-mid.jpg', 'image_urls' => ['assets/images/project-mid.jpg'], 'created_at' => date('Y-m-d H:i:s') ] ]; file_put_contents(PROJECTS_FILE, json_encode($default_projects, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); } if (!file_exists(TEAM_FILE)) { $default_team = [ [ 'id' => 1, 'name' => 'Trần Thái Hà', 'position' => 'Giám đốc - KTS Trưởng', 'description' => 'Người dẫn dắt định hướng thiết kế và phát triển dự án.', 'photo_url' => 'assets/images/tran_thai_ha.jpg', 'status' => 'active', 'created_at' => date('Y-m-d H:i:s') ], [ 'id' => 2, 'name' => 'Lê Minh Anh', 'position' => 'Trưởng phòng Thiết kế Nội thất', 'description' => 'Chịu trách nhiệm kiến tạo không gian nội thất sang trọng và tinh tế.', 'photo_url' => 'assets/images/team-female.jpg', 'status' => 'active', 'created_at' => date('Y-m-d H:i:s') ], [ 'id' => 3, 'name' => 'Nguyễn Hoài Nam', 'position' => 'Giám đốc Kỹ thuật & Thi công', 'description' => 'Bảo đảm thi công chính xác và kiểm soát chất lượng thực tế.', 'photo_url' => 'assets/images/team-male-worker.jpg', 'status' => 'active', 'created_at' => date('Y-m-d H:i:s') ] ]; file_put_contents(TEAM_FILE, json_encode($default_team, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); } if (!file_exists(ABOUT_FILE)) { $default_about = [ 'main_title' => 'Mỗi công trình là một kiệt tác nghệ thuật độc bản.', 'main_description' => 'Được dẫn dắt bởi KTS. Trần Thái Hà, chúng tôi không chỉ xây dựng nhà, chúng tôi kiến tạo những trải nghiệm sống. Với triết lý lấy con người làm trung tâm, mỗi đường nét thiết kế đều mang trong mình hơi thở của sự sang trọng, bền vững và cá tính riêng của gia chủ.', 'stats' => [ ['id' => 1, 'count' => '6+', 'label' => 'Năm kinh nghiệm'], ['id' => 2, 'count' => '50+', 'label' => 'Dự án hoàn thành'] ], 'showcase' => [ [ 'id' => 1, 'label' => 'Công trình tiêu biểu', 'title' => 'Kiệt tác kiến trúc độc bản', 'description' => 'Khám phá những dự án tiêu biểu và hình ảnh thiết kế đẳng cấp được quản lý bằng admin.', 'image_url' => 'assets/images/project-mid.jpg', 'status' => 'active' ], [ 'id' => 2, 'label' => 'Sản phẩm nội thất', 'title' => 'Không gian nội thất sang trọng', 'description' => 'Mỗi hình ảnh thể hiện phong cách thiết kế tinh tế, hoàn thiện bởi đội ngũ chuyên nghiệp.', 'image_url' => 'assets/images/project-side-1.jpg', 'status' => 'active' ], [ 'id' => 3, 'label' => 'Không gian thượng lưu', 'title' => 'Thiết kế đậm chất thượng lưu', 'description' => 'Từng chi tiết được chăm chút tỉ mỉ để tạo nên không gian sống đẳng cấp.', 'image_url' => 'assets/images/project-side-2.jpg', 'status' => 'active' ] ] ]; file_put_contents(ABOUT_FILE, json_encode($default_about, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); } /** * Helper Functions */ // Sanitize input if (!function_exists('sanitize')) { function sanitize($input) { return htmlspecialchars(strip_tags($input), ENT_QUOTES, 'UTF-8'); } } // Save consultation to JSON file if (!function_exists('save_consultation')) { function save_consultation($data) { $consultations = []; // Load existing consultations if (file_exists(CONSULTATIONS_FILE)) { $json = file_get_contents(CONSULTATIONS_FILE); $consultations = json_decode($json, true) ?? []; } // Add new consultation $data['id'] = count($consultations) + 1; $data['status'] = 'new'; $data['created_at'] = date('Y-m-d H:i:s'); $consultations[] = $data; // Save to file return file_put_contents(CONSULTATIONS_FILE, json_encode($consultations, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) !== false; } } // Get all consultations if (!function_exists('get_consultations')) { function get_consultations() { if (!file_exists(CONSULTATIONS_FILE)) { return []; } $json = file_get_contents(CONSULTATIONS_FILE); return json_decode($json, true) ?? []; } } // Count new consultations if (!function_exists('count_new_consultations')) { function count_new_consultations() { global $mysqli; if (isset($mysqli) && $mysqli instanceof mysqli) { $result = $mysqli->query("SELECT COUNT(*) AS count FROM consultations WHERE status = 'new'"); if ($result) { $row = $result->fetch_assoc(); return intval($row['count'] ?? 0); } } $consultations = get_consultations(); return count(array_filter($consultations, function($c) { return $c['status'] === 'new'; })); } } // Get all projects if (!function_exists('get_projects')) { function get_projects() { if (!file_exists(PROJECTS_FILE)) { return []; } $json = file_get_contents(PROJECTS_FILE); $projects = json_decode($json, true) ?? []; usort($projects, function($a, $b) { return strtotime($b['created_at']) - strtotime($a['created_at']); }); return $projects; } } // Get project by ID if (!function_exists('get_project_by_id')) { function get_project_by_id($id) { $projects = get_projects(); foreach ($projects as $project) { if ($project['id'] == $id) { return $project; } } return null; } } // Save project list if (!function_exists('save_projects')) { function save_projects($projects) { return file_put_contents(PROJECTS_FILE, json_encode(array_values($projects), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) !== false; } } // Get all team members if (!function_exists('get_team_members')) { function get_team_members() { if (!file_exists(TEAM_FILE)) { return []; } $json = file_get_contents(TEAM_FILE); $members = json_decode($json, true) ?? []; usort($members, function($a, $b) { return strtotime($b['created_at']) - strtotime($a['created_at']); }); return $members; } } // Save team member list if (!function_exists('save_team_members')) { function save_team_members($members) { return file_put_contents(TEAM_FILE, json_encode(array_values($members), JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) !== false; } } // Get about section content if (!function_exists('get_about_content')) { function get_about_content() { if (!file_exists(ABOUT_FILE)) { return [ 'main_title' => 'Mỗi công trình là một kiệt tác nghệ thuật độc bản.', 'main_description' => 'Được dẫn dắt bởi KTS. Trần Thái Hà, chúng tôi không chỉ xây dựng nhà, chúng tôi kiến tạo những trải nghiệm sống. Với triết lý lấy con người làm trung tâm, mỗi đường nét thiết kế đều mang trong mình hơi thở của sự sang trọng, bền vững và cá tính riêng của gia chủ.', 'stats' => [ ['id' => 1, 'count' => '6+', 'label' => 'Năm kinh nghiệm'], ['id' => 2, 'count' => '50+', 'label' => 'Dự án hoàn thành'] ], 'showcase' => [] ]; } $json = file_get_contents(ABOUT_FILE); $data = json_decode($json, true) ?: []; return array_merge([ 'main_title' => '', 'main_description' => '', 'stats' => [], 'showcase' => [] ], $data); } } // Save about section content if (!function_exists('save_about_content')) { function save_about_content($content) { return file_put_contents(ABOUT_FILE, json_encode($content, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)) !== false; } } // Add a new team member if (!function_exists('add_team_member')) { function add_team_member($member) { $members = get_team_members(); $member['id'] = count($members) > 0 ? max(array_column($members, 'id')) + 1 : 1; $member['created_at'] = date('Y-m-d H:i:s'); $members[] = $member; return save_team_members($members); } } // Update existing team member if (!function_exists('update_team_member')) { function update_team_member($id, $updated_data) { $members = get_team_members(); foreach ($members as &$member) { if ($member['id'] == $id) { $member = array_merge($member, $updated_data); return save_team_members($members); } } return false; } } // Delete team member by ID if (!function_exists('delete_team_member')) { function delete_team_member($id) { $members = get_team_members(); $updated = []; foreach ($members as $member) { if ($member['id'] == $id) { if (!empty($member['photo_url']) && strpos($member['photo_url'], 'assets/uploads/') !== false) { @unlink(__DIR__ . '/../' . $member['photo_url']); } continue; } $updated[] = $member; } return save_team_members($updated); } } // Add a new project if (!function_exists('add_project')) { function add_project($project) { $projects = get_projects(); $project['id'] = count($projects) > 0 ? max(array_column($projects, 'id')) + 1 : 1; $project['created_at'] = date('Y-m-d H:i:s'); $projects[] = $project; return save_projects($projects); } } // Update existing project if (!function_exists('update_project')) { function update_project($id, $updated_data) { $projects = get_projects(); foreach ($projects as &$project) { if ($project['id'] == $id) { $project = array_merge($project, $updated_data); return save_projects($projects); } } return false; } } // Delete project by ID if (!function_exists('delete_project')) { function delete_project($id) { $projects = get_projects(); $updated = []; foreach ($projects as $project) { if ($project['id'] == $id) { // delete uploaded files if stored under uploads if (!empty($project['featured_image']) && strpos($project['featured_image'], 'assets/uploads/') !== false) { @unlink(__DIR__ . '/../' . $project['featured_image']); } if (!empty($project['image_urls']) && is_array($project['image_urls'])) { foreach ($project['image_urls'] as $image_url) { if (strpos($image_url, 'assets/uploads/') !== false) { @unlink(__DIR__ . '/../' . $image_url); } } } continue; } $updated[] = $project; } return save_projects($updated); } } // Upload and return URL string if (!function_exists('handle_upload')) { function handle_upload($file) { if (!isset($file['tmp_name']) || empty($file['tmp_name'])) { return ''; } $upload_dir = UPLOAD_DIR; if (!is_dir($upload_dir)) { mkdir($upload_dir, 0755, true); } $file_ext = pathinfo($file['name'], PATHINFO_EXTENSION); $file_name = time() . '_' . uniqid() . '.' . $file_ext; $file_path = $upload_dir . $file_name; if (move_uploaded_file($file['tmp_name'], $file_path)) { return '/assets/uploads/' . $file_name; } return ''; } } // Convert stored upload paths for frontend (strip leading slash for subdirectory installs) if (!function_exists('resolve_asset_url')) { function resolve_asset_url($url, $default = '') { if (empty($url)) { return $default; } if ($url[0] === '/') { return ltrim($url, '/'); } return $url; } } // Convert asset paths for admin pages (admin/pages/ -> project root) if (!function_exists('resolve_admin_asset_url')) { function resolve_admin_asset_url($url, $default = '') { if (empty($url)) { return $default; } if (strpos($url, 'http://') === 0 || strpos($url, 'https://') === 0) { return $url; } $path = ltrim($url, '/'); if (strpos($path, 'assets/') === 0) { return '../../' . $path; } return $url; } } // Get user by username if (!function_exists('get_user_by_username')) { function get_user_by_username($username) { if (!file_exists(USERS_FILE)) { return null; } $json = file_get_contents(USERS_FILE); $users = json_decode($json, true) ?? []; foreach ($users as $user) { if ($user['username'] === $username && $user['status'] == 1) { return $user; } } return null; } } // Check if user is logged in if (!function_exists('is_logged_in')) { function is_logged_in() { return isset($_SESSION['user_id']) && !empty($_SESSION['user_id']); } } // Get current user if (!function_exists('get_current_user')) { function get_current_user() { if (!is_logged_in()) return null; if (!file_exists(USERS_FILE)) { return null; } $json = file_get_contents(USERS_FILE); $users = json_decode($json, true) ?? []; $user_id = $_SESSION['user_id']; foreach ($users as $user) { if ($user['id'] == $user_id) { return $user; } } return null; } } // Require login if (!function_exists('require_login')) { function require_login() { if (!is_logged_in()) { header('Location: ' . ADMIN_URL . '/login.php'); exit; } } } // Hash password if (!function_exists('hash_password')) { function hash_password($password) { return password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]); } } // Verify password if (!function_exists('verify_password')) { function verify_password($password, $hash) { return password_verify($password, $hash); } } // JSON response helper if (!function_exists('json_response')) { function json_response($success, $message, $data = null) { header('Content-Type: application/json'); echo json_encode([ 'success' => $success, 'message' => $message, 'data' => $data ]); exit; } } // Convert slug from title if (!function_exists('create_slug')) { function create_slug($title) { $slug = strtolower($title); $slug = preg_replace('/[^a-z0-9]+/', '-', $slug); $slug = trim($slug, '-'); return $slug; } } // Format date if (!function_exists('format_date')) { function format_date($date, $format = 'd/m/Y H:i') { return date($format, strtotime($date)); } } // Default homepage services (source of truth for initial sync) if (!function_exists('get_default_services_data')) { function get_default_services_data() { return [ [ 'title' => 'Thiết kế Kiến trúc', 'slug' => 'thiet-ke-kien-truc', 'icon' => 'architecture', 'description' => 'Kiến tạo hình khối và không gian độc bản, tối ưu công năng và thẩm mỹ.', 'sort_order' => 1, ], [ 'title' => 'Thi công Trọn gói', 'slug' => 'thi-cong-tron-goi', 'icon' => 'construction', 'description' => 'Cam kết chất lượng thi công tinh xảo, đúng tiến độ và ngân sách.', 'sort_order' => 2, ], [ 'title' => 'Thiết kế Nội thất', 'slug' => 'thiet-ke-noi-that', 'icon' => 'chair', 'description' => 'Sắp đặt nội thất tinh tế, phản ánh phong cách cá nhân của chủ sở hữu.', 'sort_order' => 3, ], [ 'title' => 'Tư vấn Giám sát', 'slug' => 'tu-van-giam-sat', 'icon' => 'visibility', 'description' => 'Đảm bảo mọi chi tiết thiết kế được thực thi chính xác trên thực tế.', 'sort_order' => 4, ], [ 'title' => 'Cải tạo Kiến trúc', 'slug' => 'cai-tao-kien-truc', 'icon' => 'history_edu', 'description' => 'Làm mới và tối ưu hóa không gian cũ với ngôn ngữ thiết kế hiện đại.', 'sort_order' => 5, ], ]; } } // Sync default services into database if (!function_exists('sync_default_services')) { function sync_default_services() { global $mysqli; $mysqli->query('DELETE FROM services'); foreach (get_default_services_data() as $service) { $title = $mysqli->real_escape_string($service['title']); $slug = $mysqli->real_escape_string($service['slug']); $icon = $mysqli->real_escape_string($service['icon']); $description = $mysqli->real_escape_string($service['description']); $sort_order = intval($service['sort_order']); $mysqli->query( "INSERT INTO services (title, slug, icon, description, status, sort_order) VALUES ('$title', '$slug', '$icon', '$description', 'active', $sort_order)" ); } } } // Ensure homepage services exist in database if (!function_exists('ensure_default_services_synced')) { function ensure_default_services_synced() { global $mysqli; $result = $mysqli->query("SELECT COUNT(*) AS cnt FROM services WHERE slug = 'thiet-ke-kien-truc'"); if ($result && intval($result->fetch_assoc()['cnt']) === 0) { sync_default_services(); } } } // Get services from database if (!function_exists('get_services')) { function get_services($active_only = true) { global $mysqli; $sql = 'SELECT * FROM services'; if ($active_only) { $sql .= " WHERE status = 'active'"; } $sql .= ' ORDER BY sort_order ASC, id ASC'; $result = $mysqli->query($sql); $services = []; if ($result) { while ($row = $result->fetch_assoc()) { $services[] = $row; } } return $services; } } ?>
💾 Simpan File
Batal
⬅ Naik ke kientructhaiha.com
1 item
Nama
Tipe
Ukuran
Diubah
Aksi
🐘
config.php
php
23.2 KB
2026-06-10 09:24
✏️ Edit
👁️ View
🗑 Hapus