// ============================================================ // API 接口 - 从 config 读取数据转换输出 // ============================================================ if (!function_exists('apiResponse')) { function apiResponse($code = 200, $message = 'success', $data = array()) { header('Content-Type: application/json; charset=utf-8'); header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type, Authorization'); if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { exit(0); } if ($data === null) { $data = array(); } echo json_encode(array( 'code' => $code, 'message' => $message, 'data' => $data, 'timestamp' => time() ), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } } if (!function_exists('apiDispatcher')) { function apiDispatcher($method) { global $config; $map = array( 'dataInfo' => 'apiGetDataInfo', 'getDataInfo' => 'apiGetDataInfo', 'getNav' => 'apiGetNav', 'getBottom' => 'apiGetBottom', 'getBanner' => 'apiGetBanner', 'getContacts' => 'apiGetContacts', 'getLinks' => 'apiGetLinks', 'getMenu' => 'apiGetMenu', 'getCards' => 'apiGetCards', 'getMusic' => 'apiGetMusic', 'getMarquee' => 'apiGetMarquee', 'getDomains' => 'apiGetDomains', 'getAll' => 'apiGetAll', 'getFull' => 'apiGetFull', 'getWebInfo' => 'apiGetWebInfo', 'getConfig' => 'apiGetConfig', 'getVersion' => 'apiGetVersion', 'ping' => 'apiPing', 'getIco' => 'apiGetIco', 'ico' => 'apiGetIco' ); if (!isset($map[$method])) { apiResponse(404, '接口不存在: ' . $method); return; } $fn = $map[$method]; if (function_exists($fn)) { $fn($config); } else { apiResponse(500, '接口实现缺失: ' . $method); } } } if (!function_exists('apiGetDataInfo')) { function apiGetDataInfo($config) { $categories = isset($config['nav_categories']) ? $config['nav_categories'] : array(); $links = isset($config['nav_links']) ? $config['nav_links'] : array(); $data = array(); foreach ($categories as $ci => $cat) { $catName = isset($cat['name']) ? $cat['name'] : ''; if (empty($catName)) { continue; } $item = array( 'cid' => $ci + 1, 'name' => $catName, 'icon' => isset($cat['icon']) ? $cat['icon'] : '', 'state' => 1, 'create_time' => date('Y-m-d H:i:s'), 'project' => array() ); foreach ($links as $li => $link) { $linkCategory = isset($link['category']) ? $link['category'] : ''; if ($linkCategory === $catName) { $item['project'][] = array( 'pid' => $li + 1, 'cid' => $ci + 1, 'name' => isset($link['name']) ? $link['name'] : '', 'popup' => 0, 'link' => isset($link['url']) ? $link['url'] : '', 'logo' => isset($link['icon']) ? $link['icon'] : '', 'desc' => isset($link['desc']) ? $link['desc'] : '', 'state' => 1, 'type' => 1, 'create_time' => date('Y-m-d H:i:s'), 'sort' => isset($link['sort']) ? intval($link['sort']) : $li, 'color' => isset($link['color']) ? $link['color'] : '' ); } } usort($item['project'], function($a, $b) { return $a['sort'] - $b['sort']; }); if (!empty($item['project'])) { $data[] = $item; } } apiResponse(200, 'success', $data); } } if (!function_exists('apiGetNav')) { function apiGetNav($config) { return apiGetDataInfo($config); } } if (!function_exists('apiGetBanner')) { function apiGetBanner($config) { $slides = isset($config['slides']) ? $config['slides'] : array(); $enabled = isset($slides['enabled']) ? $slides['enabled'] : false; $items = isset($slides['items']) ? $slides['items'] : array(); if (!$enabled || empty($items)) { apiResponse(200, 'success', array()); return; } $data = array(); foreach ($items as $i => $item) { $data[] = array( 'id' => $i + 1, 'title' => isset($item['title']) ? $item['title'] : '', 'image' => isset($item['image']) ? $item['image'] : '', 'url' => isset($item['link']) ? $item['link'] : '', 'sort' => isset($item['sort']) ? intval($item['sort']) : $i, 'state' => 1, 'create_time' => date('Y-m-d H:i:s') ); } usort($data, function($a, $b) { return $a['sort'] - $b['sort']; }); apiResponse(200, 'success', $data); } } if (!function_exists('apiGetBottom')) { function apiGetBottom($config) { $contacts = isset($config['contacts']) ? $config['contacts'] : array(); if (empty($contacts)) { apiResponse(200, 'success', array()); return; } $data = array(); foreach ($contacts as $i => $c) { $data[] = array( 'id' => $i + 1, 'title' => isset($c['name']) ? $c['name'] : '', 'name' => isset($c['name']) ? $c['name'] : '', 'description' => isset($c['value']) ? $c['value'] : '', 'value' => isset($c['value']) ? $c['value'] : '', 'icon' => isset($c['icon']) ? $c['icon'] : '', 'url' => isset($c['link']) ? $c['link'] : '', 'type' => 1, 'state' => 1, 'create_time' => date('Y-m-d H:i:s') ); } apiResponse(200, 'success', $data); } } if (!function_exists('apiGetContacts')) { function apiGetContacts($config) { $contacts = isset($config['contacts']) ? $config['contacts'] : array(); if (empty($contacts)) { apiResponse(200, 'success', array()); return; } $data = array(); foreach ($contacts as $i => $c) { $data[] = array( 'id' => $i + 1, 'name' => isset($c['name']) ? $c['name'] : '', 'value' => isset($c['value']) ? $c['value'] : '', 'icon' => isset($c['icon']) ? $c['icon'] : '', 'url' => isset($c['link']) ? $c['link'] : '' ); } apiResponse(200, 'success', $data); } } if (!function_exists('apiGetLinks')) { function apiGetLinks($config) { $links = isset($config['nav_links']) ? $config['nav_links'] : array(); if (empty($links)) { apiResponse(200, 'success', array()); return; } $data = array(); foreach ($links as $i => $link) { $data[] = array( 'id' => $i + 1, 'name' => isset($link['name']) ? $link['name'] : '', 'url' => isset($link['url']) ? $link['url'] : '', 'icon' => isset($link['icon']) ? $link['icon'] : '', 'desc' => isset($link['desc']) ? $link['desc'] : '', 'category' => isset($link['category']) ? $link['category'] : '', 'color' => isset($link['color']) ? $link['color'] : '', 'sort' => isset($link['sort']) ? intval($link['sort']) : $i ); } usort($data, function($a, $b) { return $a['sort'] - $b['sort']; }); apiResponse(200, 'success', $data); } } if (!function_exists('apiGetMenu')) { function apiGetMenu($config) { $menus = isset($config['menus']) ? $config['menus'] : array(); if (empty($menus)) { apiResponse(200, 'success', array()); return; } $data = array(); foreach ($menus as $i => $menu) { $data[] = array( 'id' => $i + 1, 'name' => isset($menu['name']) ? $menu['name'] : '', 'url' => isset($menu['url']) ? $menu['url'] : '', 'icon' => isset($menu['icon']) ? $menu['icon'] : '', 'color' => isset($menu['color']) ? $menu['color'] : '', 'sort' => isset($menu['sort']) ? intval($menu['sort']) : $i ); } apiResponse(200, 'success', $data); } } if (!function_exists('apiGetCards')) { function apiGetCards($config) { $cards = isset($config['cards']) ? $config['cards'] : array(); if (empty($cards)) { apiResponse(200, 'success', array()); return; } $data = array(); foreach ($cards as $i => $card) { $data[] = array( 'id' => $i + 1, 'name' => isset($card['name']) ? $card['name'] : '', 'desc' => isset($card['desc']) ? $card['desc'] : '', 'url' => isset($card['url']) ? $card['url'] : '', 'class' => isset($card['class']) ? $card['class'] : '', 'image' => isset($card['image']) ? $card['image'] : '', 'sort' => isset($card['sort']) ? intval($card['sort']) : $i ); } apiResponse(200, 'success', $data); } } if (!function_exists('apiGetMusic')) { function apiGetMusic($config) { $music = isset($config['music']) ? $config['music'] : array(); apiResponse(200, 'success', array( 'enabled' => isset($music['enabled']) ? $music['enabled'] : false, 'auto_play' => isset($music['auto_play']) ? $music['auto_play'] : false, 'playlist' => isset($music['playlist']) ? $music['playlist'] : array(), 'default_cover' => isset($music['default_cover']) ? $music['default_cover'] : '' )); } } if (!function_exists('apiGetMarquee')) { function apiGetMarquee($config) { $marquee = isset($config['marquee']) ? $config['marquee'] : array(); apiResponse(200, 'success', array( 'enabled' => isset($marquee['enabled']) ? $marquee['enabled'] : false, 'text' => isset($marquee['text']) ? $marquee['text'] : '', 'speed' => isset($marquee['speed']) ? $marquee['speed'] : 12, 'bg' => isset($marquee['bg']) ? $marquee['bg'] : '', 'color' => isset($marquee['color']) ? $marquee['color'] : '' )); } } if (!function_exists('apiGetDomains')) { function apiGetDomains($config) { $domains = isset($config['domains']) ? $config['domains'] : array(); if (empty($domains)) { apiResponse(200, 'success', array()); return; } $data = array(); foreach ($domains as $i => $domain) { $data[] = array( 'id' => $i + 1, 'domain' => isset($domain['domain']) ? $domain['domain'] : '', 'status' => isset($domain['status']) ? $domain['status'] : '', 'template' => isset($domain['template']) ? $domain['template'] : '' ); } apiResponse(200, 'success', $data); } } if (!function_exists('apiGetAll')) { function apiGetAll($config) { apiResponse(200, 'success', array( 'banner' => getBannerData($config), 'nav' => getNavData($config), 'contacts' => getContactsData($config), 'info' => getInfoData($config), 'menu' => getMenuData($config), 'cards' => getCardsData($config), 'music' => getMusicData($config), 'marquee' => getMarqueeData($config) )); } } if (!function_exists('apiGetFull')) { function apiGetFull($config) { apiResponse(200, 'success', array( 'banner' => getBannerData($config), 'nav' => getNavData($config), 'contacts' => getContactsData($config), 'info' => getInfoData($config), 'menu' => getMenuData($config), 'cards' => getCardsData($config), 'music' => getMusicData($config), 'marquee' => getMarqueeData($config), 'domains' => getDomainsData($config), 'templates' => isset($config['templates']) ? $config['templates'] : array() )); } } if (!function_exists('apiGetWebInfo')) { function apiGetWebInfo($config) { $host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; $marquee = isset($config['marquee']) ? $config['marquee'] : array(); apiResponse(200, 'success', array( 'system' => isset($config['system']) ? $config['system'] : array(), 'page' => isset($config['page']) ? $config['page'] : array(), 'slides' => isset($config['slides']) ? $config['slides'] : array(), 'marquee' => isset($config['marquee']) ? $config['marquee'] : array(), 'contacts' => isset($config['contacts']) ? $config['contacts'] : array(), 'nav_categories' => isset($config['nav_categories']) ? $config['nav_categories'] : array(), 'nav_links' => isset($config['nav_links']) ? $config['nav_links'] : array(), 'menus' => isset($config['menus']) ? $config['menus'] : array(), 'cards' => isset($config['cards']) ? $config['cards'] : array(), 'music' => isset($config['music']) ? $config['music'] : array(), 'domains' => isset($config['domains']) ? $config['domains'] : array(), 'templates' => isset($config['templates']) ? $config['templates'] : array(), 'host' => $host, 'version' => '2.0.0', 'timestamp' => time(), 'title' => isset($config['system']['site_title']) ? $config['system']['site_title'] : '', 'gg' => isset($marquee['text']) ? $marquee['text'] : '', 'domain' => $host )); } } if (!function_exists('apiGetConfig')) { function apiGetConfig($config) { $filtered = $config; if (isset($filtered['admin'])) { unset($filtered['admin']['password']); } apiResponse(200, 'success', $filtered); } } if (!function_exists('apiGetVersion')) { function apiGetVersion($config) { apiResponse(200, 'success', array( 'version' => '2.0.0', 'name' => '酷客导航', 'author' => 'HYuanR', 'email' => 'relayx@zohomail.com', 'website' => 'https://www.kkedh.cc', 'php_version' => PHP_VERSION, 'timestamp' => time() )); } } if (!function_exists('apiPing')) { function apiPing($config) { apiResponse(200, 'pong', array( 'timestamp' => time(), 'server_time' => date('Y-m-d H:i:s'), 'status' => 'ok' )); } } if (!function_exists('apiGetIco')) { function apiGetIco($config) { $system = isset($config['system']) ? $config['system'] : array(); $favicon = isset($system['favicon']) ? $system['favicon'] : ''; if (!empty($favicon)) { if (strpos($favicon, 'http') === 0 || strpos($favicon, '//') === 0) { header('Location: ' . $favicon); exit; } $filePath = ROOT_PATH . $favicon; if (file_exists($filePath)) { $mime = mime_content_type($filePath); header('Content-Type: ' . $mime); header('Cache-Control: public, max-age=86400'); readfile($filePath); exit; } } $defaultIco = ROOT_PATH . '/ico.png'; if (file_exists($defaultIco)) { $mime = mime_content_type($defaultIco); header('Content-Type: ' . $mime); header('Cache-Control: public, max-age=86400'); readfile($defaultIco); exit; } $image = imagecreatetruecolor(64, 64); $bg = imagecolorallocate($image, 0, 150, 136); $textColor = imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $bg); imagestring($image, 5, 22, 22, 'K', $textColor); header('Content-Type: image/png'); header('Cache-Control: public, max-age=86400'); imagepng($image); imagedestroy($image); exit; } } if (!function_exists('getBannerData')) { function getBannerData($config) { $slides = isset($config['slides']['items']) ? $config['slides']['items'] : array(); $data = array(); foreach ($slides as $i => $item) { $data[] = array( 'id' => $i + 1, 'title' => isset($item['title']) ? $item['title'] : '', 'image' => isset($item['image']) ? $item['image'] : '', 'url' => isset($item['link']) ? $item['link'] : '', 'sort' => isset($item['sort']) ? intval($item['sort']) : $i ); } return $data; } } if (!function_exists('getNavData')) { function getNavData($config) { $categories = isset($config['nav_categories']) ? $config['nav_categories'] : array(); $links = isset($config['nav_links']) ? $config['nav_links'] : array(); $data = array(); foreach ($categories as $ci => $cat) { $catName = isset($cat['name']) ? $cat['name'] : ''; if (empty($catName)) { continue; } $item = array( 'cid' => $ci + 1, 'name' => $catName, 'icon' => isset($cat['icon']) ? $cat['icon'] : '', 'projects' => array() ); foreach ($links as $li => $link) { if ((isset($link['category']) ? $link['category'] : '') === $catName) { $item['projects'][] = array( 'pid' => $li + 1, 'name' => isset($link['name']) ? $link['name'] : '', 'url' => isset($link['url']) ? $link['url'] : '', 'icon' => isset($link['icon']) ? $link['icon'] : '', 'desc' => isset($link['desc']) ? $link['desc'] : '', 'color' => isset($link['color']) ? $link['color'] : '' ); } } if (!empty($item['projects'])) { $data[] = $item; } } return $data; } } if (!function_exists('getContactsData')) { function getContactsData($config) { $contacts = isset($config['contacts']) ? $config['contacts'] : array(); $data = array(); foreach ($contacts as $i => $c) { $data[] = array( 'id' => $i + 1, 'name' => isset($c['name']) ? $c['name'] : '', 'value' => isset($c['value']) ? $c['value'] : '', 'icon' => isset($c['icon']) ? $c['icon'] : '', 'url' => isset($c['link']) ? $c['link'] : '' ); } return $data; } } if (!function_exists('getInfoData')) { function getInfoData($config) { $system = isset($config['system']) ? $config['system'] : array(); return array( 'site_name' => isset($system['site_name']) ? $system['site_name'] : '', 'site_title' => isset($system['site_title']) ? $system['site_title'] : '', 'site_description' => isset($system['site_description']) ? $system['site_description'] : '', 'site_keywords' => isset($system['site_keywords']) ? $system['site_keywords'] : '', 'logo' => isset($system['logo']) ? $system['logo'] : '', 'favicon' => isset($system['favicon']) ? $system['favicon'] : '', 'status' => isset($system['status']) ? $system['status'] : '', 'domain' => isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '' ); } } if (!function_exists('getMenuData')) { function getMenuData($config) { $menus = isset($config['menus']) ? $config['menus'] : array(); $data = array(); foreach ($menus as $i => $menu) { $data[] = array( 'id' => $i + 1, 'name' => isset($menu['name']) ? $menu['name'] : '', 'url' => isset($menu['url']) ? $menu['url'] : '', 'icon' => isset($menu['icon']) ? $menu['icon'] : '', 'color' => isset($menu['color']) ? $menu['color'] : '' ); } return $data; } } if (!function_exists('getCardsData')) { function getCardsData($config) { $cards = isset($config['cards']) ? $config['cards'] : array(); $data = array(); foreach ($cards as $i => $card) { $data[] = array( 'id' => $i + 1, 'name' => isset($card['name']) ? $card['name'] : '', 'desc' => isset($card['desc']) ? $card['desc'] : '', 'url' => isset($card['url']) ? $card['url'] : '', 'class' => isset($card['class']) ? $card['class'] : '', 'image' => isset($card['image']) ? $card['image'] : '' ); } return $data; } } if (!function_exists('getMusicData')) { function getMusicData($config) { $music = isset($config['music']) ? $config['music'] : array(); return array( 'enabled' => isset($music['enabled']) ? $music['enabled'] : false, 'auto_play' => isset($music['auto_play']) ? $music['auto_play'] : false, 'playlist' => isset($music['playlist']) ? $music['playlist'] : array() ); } } if (!function_exists('getMarqueeData')) { function getMarqueeData($config) { $marquee = isset($config['marquee']) ? $config['marquee'] : array(); return array( 'enabled' => isset($marquee['enabled']) ? $marquee['enabled'] : false, 'text' => isset($marquee['text']) ? $marquee['text'] : '', 'speed' => isset($marquee['speed']) ? $marquee['speed'] : 12, 'bg' => isset($marquee['bg']) ? $marquee['bg'] : '', 'color' => isset($marquee['color']) ? $marquee['color'] : '' ); } } if (!function_exists('getDomainsData')) { function getDomainsData($config) { $domains = isset($config['domains']) ? $config['domains'] : array(); $data = array(); foreach ($domains as $i => $domain) { $data[] = array( 'id' => $i + 1, 'domain' => isset($domain['domain']) ? $domain['domain'] : '', 'status' => isset($domain['status']) ? $domain['status'] : '', 'template' => isset($domain['template']) ? $domain['template'] : '' ); } return $data; } } 酷客导航