文件
parlz-domain/search.php
T

356 行
16 KiB
PHP

<?php
require_once 'functions.php';
$currentTheme = getTheme();
if (isset($_GET['ajax']) && $_GET['ajax'] == 1) {
header('Content-Type: application/json; charset=utf-8');
$domain = isset($_GET['domain']) ? trim($_GET['domain']) : '';
if (empty($domain)) {
echo json_encode(['success' => false, 'message' => '请提供域名参数']);
exit;
}
if (!preg_match('/^([a-z0-9\-]+\.)+[a-z]{2,}$/i', $domain)) {
echo json_encode(['success' => false, 'message' => '域名格式无效']);
exit;
}
$pdo = getDB();
$parts = explode('.', $domain);
$subdomain = strtolower($parts[0]);
$mainDomain = strtolower(implode('.', array_slice($parts, 1)));
$mainDomains = getMainDomains();
if (!in_array($mainDomain, $mainDomains)) {
echo json_encode([
'success' => true,
'available' => false,
'message' => '不支持的域名: ' . $mainDomain,
'record_type' => null,
'record_value' => null,
'username' => null,
'created_at' => null
]);
exit;
}
$stmt = $pdo->prepare("SELECT d.*, u.username FROM domains d LEFT JOIN users u ON d.user_id = u.id WHERE d.main_domain = ? AND d.subdomain = ? AND d.status = 1");
$stmt->execute([$mainDomain, $subdomain]);
$record = $stmt->fetch();
if ($record) {
echo json_encode([
'success' => true,
'available' => false,
'message' => '该域名已被 ' . htmlspecialchars($record['username'] ?? '用户') . ' 占用',
'record_type' => $record['record_type'],
'record_value' => $record['record_value'],
'username' => $record['username'] ?? null,
'created_at' => $record['created_at']
]);
} else {
echo json_encode([
'success' => true,
'available' => true,
'message' => '域名可用',
'record_type' => null,
'record_value' => null,
'username' => null,
'created_at' => null
]);
}
exit;
}
?>
<!DOCTYPE html>
<html lang="zh-CN" data-theme="<?php echo $currentTheme; ?>">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>域名查询 - <?php echo SITE_NAME; ?></title>
<link rel="preload" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.0/css/all.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<link rel="stylesheet" href="style.css">
<meta name="description" content="查询域名是否被占用。支持 euil.cn、feld.top、lrgdmc.cn 等主域名。">
<meta name="keywords" content="域名查询,域名占用,子域名查询">
<meta property="og:title" content="域名查询 - <?php echo SITE_NAME; ?>">
<meta property="og:description" content="查询域名是否被占用。支持多个主域名。">
<meta property="og:image" content="https://<?php echo $_SERVER['HTTP_HOST']; ?>/favicon.ico">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:url" content="https://<?php echo $_SERVER['HTTP_HOST']; ?>/search">
<meta property="og:type" content="website">
<meta property="og:site_name" content="<?php echo SITE_NAME; ?>">
<meta property="og:locale" content="zh_CN">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="域名查询 - <?php echo SITE_NAME; ?>">
<meta name="twitter:description" content="查询域名是否被占用。">
<meta name="twitter:image" content="https://<?php echo $_SERVER['HTTP_HOST']; ?>/favicon.ico">
<meta name="robots" content="index, follow">
<link rel="alternate" hreflang="zh-CN" href="https://<?php echo $_SERVER['HTTP_HOST']; ?>/search" />
<meta name="twitter:site" content="https://<?php echo $_SERVER['HTTP_HOST']; ?>/search">
<link rel="canonical" href="https://<?php echo $_SERVER['HTTP_HOST']; ?>/search">
</head>
<body>
<div class="container">
<header>
<div class="header-content">
<h1><i class="fas fa-globe"></i> <?php echo SITE_NAME; ?></h1>
<div class="header-actions">
<form method="POST" style="display: inline;">
<input type="hidden" name="action" value="toggle_theme">
<button type="submit" class="theme-toggle" title="切换主题">
<i class="fas <?php echo $currentTheme === 'dark' ? 'fa-sun' : 'fa-moon'; ?>"></i>
</button>
</form>
<a href="auth.php?action=login" class="btn btn-primary btn-sm">
<i class="fas fa-sign-in-alt"></i>
</a>
<a href="auth.php?action=register" class="btn btn-sm" style="background:var(--bg-primary);border:1px solid var(--border-color);color:var(--text-primary);">
<i class="fas fa-user-plus"></i>
</a>
</div>
</div>
</header>
<div class="search-container">
<div class="search-header">
<h1><i class="fas fa-search"></i> 域名查询</h1>
<p>输入要查询的域名,检查是否已被注册或占用</p>
</div>
<div class="search-box">
<input type="text" id="domainInput" placeholder="输入域名,例如:abc.euil.cn" />
<button class="btn btn-primary" id="searchBtn">
<i class="fas fa-search"></i> 查询
</button>
</div>
<div class="result-card" id="resultCard">
<div class="result-status" id="resultStatus">
<div class="icon"><div class="loading-spinner"></div></div>
<div class="info">
<div class="main" id="resultMain">查询中...</div>
<div class="sub" id="resultSub">正在检查域名状态</div>
</div>
</div>
<div class="result-details" id="resultDetails">
<table>
<tr><td>完整域名</td><td id="detailFullDomain">-</td></tr>
<tr><td>状态</td><td id="detailStatus">-</td></tr>
<tr><td>所属用户</td><td id="detailUser">-</td></tr>
<tr><td>创建时间</td><td id="detailTime">-</td></tr>
</table>
</div>
<div class="result-actions" id="resultActions">
<a href="#" class="btn btn-primary" id="actionAddDomain" style="display:none;">
<i class="fas fa-plus"></i> 添加此域名
</a>
</div>
</div>
<div class="card history-card">
<div class="card-header">
<h2><i class="fas fa-clock"></i> 最近查询</h2>
<span class="clear-history" id="clearHistory">清空记录</span>
</div>
<div class="card-body" id="historyContainer">
<div class="empty-state">
<i class="fas fa-inbox"></i>
<p>暂无查询记录</p>
</div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
var domainInput = document.getElementById('domainInput');
var searchBtn = document.getElementById('searchBtn');
var resultCard = document.getElementById('resultCard');
var resultStatus = document.getElementById('resultStatus');
var resultMain = document.getElementById('resultMain');
var resultSub = document.getElementById('resultSub');
var detailFullDomain = document.getElementById('detailFullDomain');
var detailStatus = document.getElementById('detailStatus');
var detailType = document.getElementById('detailType');
var detailValue = document.getElementById('detailValue');
var detailUser = document.getElementById('detailUser');
var detailTime = document.getElementById('detailTime');
var actionAddDomain = document.getElementById('actionAddDomain');
var historyContainer = document.getElementById('historyContainer');
var clearHistoryBtn = document.getElementById('clearHistory');
loadHistory();
searchBtn.addEventListener('click', doSearch);
domainInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') doSearch();
});
document.querySelectorAll('.tag').forEach(function(tag) {
tag.addEventListener('click', function() {
domainInput.value = this.dataset.domain;
doSearch();
});
});
clearHistoryBtn.addEventListener('click', function() {
if (confirm('确定要清空所有查询记录吗?')) {
localStorage.removeItem('domainSearchHistory');
loadHistory();
}
});
function doSearch() {
var domain = domainInput.value.trim();
if (!domain) {
alert('请输入域名');
return;
}
if (!domain.match(/^([a-z0-9\-]+\.)+[a-z]{2,}$/i)) {
alert('请输入正确的域名格式,例如:api.euil.cn');
return;
}
resultCard.classList.add('show');
resultStatus.className = 'result-status checking';
resultStatus.querySelector('.icon').innerHTML = '<div class="loading-spinner"></div>';
resultMain.textContent = '查询中...';
resultSub.textContent = '正在检查域名 ' + domain;
actionAddDomain.style.display = 'none';
var xhr = new XMLHttpRequest();
xhr.open('GET', '/search/' + encodeURIComponent(domain) + '&ajax=1', true);
xhr.timeout = 30000;
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
try {
var data = JSON.parse(xhr.responseText);
if (data.success) {
displayResult(data, domain);
saveHistory(domain, data);
} else {
showError(data.message || '查询失败');
}
} catch (e) {
showError('解析响应失败');
}
} else {
showError('服务器错误 (HTTP ' + xhr.status + ')');
}
}
};
xhr.onerror = function() {
showError('网络错误,请稍后重试');
};
xhr.ontimeout = function() {
showError('请求超时,请稍后重试');
};
xhr.send();
}
function displayResult(data, domain) {
resultStatus.className = 'result-status ' + (data.available ? 'available' : 'unavailable');
resultStatus.querySelector('.icon').innerHTML = '<i class="fas ' + (data.available ? 'fa-check-circle' : 'fa-times-circle') + '"></i>';
if (data.available) {
resultMain.textContent = '✅ 域名可用!';
resultSub.textContent = '该域名尚未被注册,可以添加使用';
actionAddDomain.style.display = 'inline-block';
actionAddDomain.href = 'dashboard.php?domain=' + encodeURIComponent(domain);
} else {
resultMain.textContent = '❌ 域名已被占用';
resultSub.textContent = data.message || '该域名已被注册或占用';
actionAddDomain.style.display = 'none';
}
detailFullDomain.textContent = domain;
detailStatus.textContent = data.available ? '可用' : '已占用';
detailType.textContent = data.record_type || '-';
detailValue.textContent = data.record_value || '-';
detailUser.textContent = data.username || '-';
detailTime.textContent = data.created_at || '-';
}
function showError(message) {
resultStatus.className = 'result-status';
resultStatus.querySelector('.icon').innerHTML = '<i class="fas fa-exclamation-circle" style="color:var(--accent-red);font-size:28px;"></i>';
resultMain.textContent = '❌ 查询失败';
resultSub.textContent = message;
actionAddDomain.style.display = 'none';
detailFullDomain.textContent = '-';
detailStatus.textContent = '错误';
detailType.textContent = '-';
detailValue.textContent = '-';
detailUser.textContent = '-';
detailTime.textContent = '-';
}
function saveHistory(domain, data) {
var history = JSON.parse(localStorage.getItem('domainSearchHistory') || '[]');
history = history.filter(function(item) { return item.domain !== domain; });
history.unshift({
domain: domain,
available: data.available,
time: new Date().toISOString()
});
if (history.length > 20) history = history.slice(0, 20);
localStorage.setItem('domainSearchHistory', JSON.stringify(history));
loadHistory();
}
function loadHistory() {
var history = JSON.parse(localStorage.getItem('domainSearchHistory') || '[]');
if (history.length === 0) {
historyContainer.innerHTML = '<div class="empty-state"><i class="fas fa-inbox"></i><p>暂无查询记录</p></div>';
return;
}
var html = '<div class="history-list">';
history.forEach(function(item) {
var statusClass = item.available ? 'available' : 'unavailable';
var statusText = item.available ? '✅ 可用' : '❌ 已占用';
var time = new Date(item.time).toLocaleString('zh-CN');
html += '<div class="history-item" data-domain="' + item.domain + '">' +
'<span class="domain-name">' + item.domain + '</span>' +
'<span>' +
'<span class="status-badge ' + statusClass + '">' + statusText + '</span> ' +
'<span class="time-text">' + time + '</span>' +
'</span>' +
'</div>';
});
html += '</div>';
historyContainer.innerHTML = html;
document.querySelectorAll('.history-item').forEach(function(item) {
item.addEventListener('click', function() {
domainInput.value = this.dataset.domain;
doSearch();
});
});
}
var urlParams = new URLSearchParams(window.location.search);
var domainParam = urlParams.get('domain');
if (domainParam) {
domainInput.value = domainParam;
doSearch();
}
});
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SearchResultsPage",
"name": "域名查询 - <?php echo SITE_NAME; ?>",
"description": "查询域名是否被占用,支持 euil.cn、feld.top、lrgdmc.cn 等主域名。",
"url": "https://<?php echo $_SERVER['HTTP_HOST']; ?>/search",
"inLanguage": "zh-CN",
"about": {
"@type": "Thing",
"name": "域名查询"
}
}
</script>
</body>
</html>