❌ 数据库文件不存在!请确认路径正确。');
}
// 获取请求参数
$action = isset($_GET['action']) ? $_GET['action'] : '';
$dateFilter = isset($_GET['date']) ? $_GET['date'] : '';
$limit = isset($_GET['limit']) ? intval($_GET['limit']) : 50;
// 限制最大记录数
if ($limit > 200 || $limit < 1) {
$limit = 50;
}
/**
* 连接SQLite数据库
*/
function getDatabaseConnection($dbPath) {
try {
$db = new PDO("sqlite:" . $dbPath);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
return $db;
} catch (PDOException $e) {
error_log("数据库连接失败: " . $e->getMessage());
return null;
}
}
/**
* 格式化日期显示
*/
function formatDate($dateStr) {
if (empty($dateStr)) return '未知时间';
$timestamp = strtotime($dateStr);
if ($timestamp === false) {
return $dateStr;
}
return date('Y-m-d H:i:s', $timestamp);
}
/**
* 截断文本到指定长度
*/
function truncateText($text, $maxLength = 200) {
if (empty($text)) return '';
if (mb_strlen($text, 'UTF-8') <= $maxLength) return $text;
return mb_substr($text, 0, $maxLength, 'UTF-8') . '...';
}
/**
* 获取安全新闻数据
*/
function getSecNews($db, $dateFilter = '', $limit = 50) {
if ($dateFilter) {
$sql = "SELECT article_title, link, author, description, source, upload_time, category
FROM sec_news
WHERE DATE(upload_time) = :date
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
} else {
$sql = "SELECT article_title, link, author, description, source, upload_time, category
FROM sec_news
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
}
$stmt->execute();
return $stmt->fetchAll();
}
/**
* 获取技术文章数据
*/
function getTechPassage($db, $dateFilter = '', $limit = 50) {
if ($dateFilter) {
$sql = "SELECT article_title, link, author, description, source, upload_time, category
FROM tech_passage
WHERE DATE(upload_time) = :date
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
} else {
$sql = "SELECT article_title, link, author, description, source, upload_time, category
FROM tech_passage
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
}
$stmt->execute();
return $stmt->fetchAll();
}
/**
* 获取百度新闻数据
*/
function getBaiduNews($db, $dateFilter = '', $limit = 50) {
if ($dateFilter) {
$sql = "SELECT article_title, link, description, source, upload_time, keyword
FROM baidu
WHERE DATE(upload_time) = :date
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
} else {
$sql = "SELECT article_title, link, description, source, upload_time, keyword
FROM baidu
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
}
$stmt->execute();
return $stmt->fetchAll();
}
/**
* 获取GitHub动态数据
*/
function getGithubNews($db, $dateFilter = '', $limit = 50) {
if ($dateFilter) {
$sql = "SELECT article_title, link, description, author, upload_time, keyword, language, source
FROM github
WHERE DATE(upload_time) = :date
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
} else {
$sql = "SELECT article_title, link, description, author, upload_time, keyword, language, source
FROM github
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
}
$stmt->execute();
return $stmt->fetchAll();
}
/**
* 获取微信文章数据(搜狗微信)
*/
function getWxNews($db, $dateFilter = '', $limit = 50) {
if ($dateFilter) {
$sql = "SELECT article_title, link, description, upload_time, author, keyword
FROM wx_news
WHERE DATE(upload_time) = :date
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
} else {
$sql = "SELECT article_title, link, description, upload_time, author, keyword
FROM wx_news
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
}
$stmt->execute();
return $stmt->fetchAll();
}
/**
* 获取其他RSS源数据(uni_rss表)
*/
function getOtherRss($db, $dateFilter = '', $limit = 50) {
if ($dateFilter) {
$sql = "SELECT article_title, link, description, upload_time, author, source
FROM uni_rss
WHERE DATE(upload_time) = :date
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':date', $dateFilter, PDO::PARAM_STR);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
} else {
$sql = "SELECT article_title, link, description, upload_time, author, source
FROM uni_rss
ORDER BY upload_time DESC
LIMIT :limit";
$stmt = $db->prepare($sql);
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
}
$stmt->execute();
return $stmt->fetchAll();
}
/**
* 渲染安全新闻HTML
*/
function renderSecNews($articles) {
if (empty($articles)) {
return '
';
}
$html = '';
foreach ($articles as $article) {
$html .= '';
$html .= '
';
$html .= '
';
if (!empty($article['author'])) {
$html .= '作者:' . htmlspecialchars($article['author']) . '';
}
$html .= '上传时间:' . formatDate($article['upload_time']) . '';
if (!empty($article['source'])) {
$html .= '来源:' . htmlspecialchars($article['source']) . '';
}
if (!empty($article['category'])) {
$html .= '类型:' . htmlspecialchars($article['category']) . '';
}
$html .= '
';
if (!empty($article['description'])) {
$html .= '
' . htmlspecialchars(truncateText($article['description'], 300)) . '
';
}
$html .= '
';
$html .= '
';
}
return $html;
}
/**
* 渲染技术文章HTML
*/
function renderTechPassage($articles) {
if (empty($articles)) {
return '';
}
$html = '';
foreach ($articles as $article) {
$html .= '';
$html .= '
';
$html .= '
';
if (!empty($article['author'])) {
$html .= '作者:' . htmlspecialchars($article['author']) . '';
}
$html .= '上传时间:' . formatDate($article['upload_time']) . '';
if (!empty($article['source'])) {
$html .= '来源:' . htmlspecialchars($article['source']) . '';
}
if (!empty($article['category'])) {
$html .= '类型:' . htmlspecialchars($article['category']) . '';
}
$html .= '
';
if (!empty($article['description'])) {
$html .= '
' . htmlspecialchars(truncateText($article['description'], 300)) . '
';
}
$html .= '
';
$html .= '
';
}
return $html;
}
/**
* 渲染百度新闻HTML
*/
function renderBaiduNews($articles) {
if (empty($articles)) {
return '';
}
$html = '';
foreach ($articles as $article) {
$html .= '';
$html .= '
';
$html .= '
';
$html .= '上传时间:' . formatDate($article['upload_time']) . '';
if (!empty($article['source'])) {
$html .= '来源:' . htmlspecialchars($article['source']) . '';
}
if (!empty($article['keyword'])) {
$html .= '关键词:' . htmlspecialchars($article['keyword']) . '';
}
$html .= '
';
if (!empty($article['description'])) {
$html .= '
' . htmlspecialchars(truncateText($article['description'], 300)) . '
';
}
$html .= '
';
$html .= '
';
}
return $html;
}
/**
* 渲染GitHub动态HTML(根据source字段区分四种情况)
*/
function renderGithubNews($articles) {
if (empty($articles)) {
return '';
}
$html = '';
foreach ($articles as $article) {
$html .= '';
// 获取source字段
$source = isset($article['source']) ? trim($article['source']) : '';
$title = htmlspecialchars($article['article_title']);
$link = htmlspecialchars($article['link']);
// 根据source值判断显示格式
if ($source === 'New project') {
$keyword = !empty($article['keyword']) ? '【' . htmlspecialchars($article['keyword']) . '】' : '';
$html .= '
';
if (!empty($article['description'])) {
$html .= '
项目描述:' . htmlspecialchars(truncateText($article['description'], 300)) . '
';
}
$html .= '
';
$html .= '上传时间:' . formatDate($article['upload_time']) . '';
if (!empty($article['language'])) {
$html .= '开发语言:' . htmlspecialchars($article['language']) . '';
}
if (!empty($article['author'])) {
$html .= '作者:' . htmlspecialchars($article['author']) . '';
}
$html .= '
';
} elseif ($source === 'Project update') {
$html .= '
';
$html .= '
';
$html .= '更新时间:' . formatDate($article['upload_time']) . '';
if (!empty($article['author'])) {
$html .= '提交者:' . htmlspecialchars($article['author']) . '';
}
$html .= '
';
if (!empty($article['description'])) {
$html .= '
更新描述:' . htmlspecialchars(truncateText($article['description'], 300)) . '
';
}
if (!empty($article['keyword'])) {
$html .= '
';
}
} elseif ($source === 'New tool') {
$author = !empty($article['author']) ? '【' . htmlspecialchars($article['author']) . '】' : '【未知作者】';
$html .= '
';
if (!empty($article['description'])) {
$html .= '
项目描述:' . htmlspecialchars(truncateText($article['description'], 300)) . '
';
}
$html .= '
上传时间:' . formatDate($article['upload_time']) . '
';
} elseif ($source === 'New version') {
$author = !empty($article['author']) ? '【' . htmlspecialchars($article['author']) . '】' : '【未知作者】';
$html .= '
' . $author . '为 ' . $title . ' 发布了新版本,请及时查收!
';
$html .= '
发布时间:' . formatDate($article['upload_time']) . '
';
} else {
// 默认格式
$html .= '
';
$html .= '
';
if (!empty($article['author'])) {
$html .= '作者:' . htmlspecialchars($article['author']) . '';
}
$html .= '更新时间:' . formatDate($article['upload_time']) . '';
if (!empty($article['keyword'])) {
$html .= '关键词:' . htmlspecialchars($article['keyword']) . '';
}
if (!empty($article['language'])) {
$html .= '语言:' . htmlspecialchars($article['language']) . '';
}
if (!empty($source)) {
$html .= '类型:' . htmlspecialchars($source) . '';
}
$html .= '
';
if (!empty($article['description'])) {
$html .= '
' . htmlspecialchars(truncateText($article['description'], 300)) . '
';
}
}
$html .= '
';
$html .= '
';
}
return $html;
}
/**
* 渲染微信文章HTML(搜狗微信)
*/
function renderWxNews($articles) {
if (empty($articles)) {
return '';
}
$html = '';
foreach ($articles as $article) {
$html .= '';
$keyword = isset($article['keyword']) ? trim($article['keyword']) : '';
$title = htmlspecialchars($article['article_title']);
$link = htmlspecialchars($article['link']);
if (!empty($keyword)) {
$html .= '
关键词【' . htmlspecialchars($keyword) . '】发现新文章:' . $title . '
';
} else {
$html .= '
';
}
$html .= '
';
if (!empty($article['description'])) {
$html .= '描述:' . htmlspecialchars(truncateText($article['description'], 300)) . '';
}
$html .= '上传时间:' . formatDate($article['upload_time']) . '';
if (!empty($article['author'])) {
$html .= '作者:' . htmlspecialchars($article['author']) . '';
}
$html .= '
';
$html .= '
';
$html .= '
';
}
return $html;
}
/**
* 渲染其他RSS源HTML(uni_rss)
*/
function renderOtherRss($articles) {
if (empty($articles)) {
return '';
}
$html = '';
foreach ($articles as $article) {
$html .= '';
$source = isset($article['source']) ? trim($article['source']) : '';
$title = htmlspecialchars($article['article_title']);
$link = htmlspecialchars($article['link']);
if (!empty($source)) {
$html .= '
【' . htmlspecialchars($source) . '】RSS源发现新文章:' . $title . '
';
} else {
$html .= '
';
}
$html .= '
';
if (!empty($article['description'])) {
$html .= '描述:' . htmlspecialchars(truncateText($article['description'], 300)) . '';
}
$html .= '上传时间:' . formatDate($article['upload_time']) . '';
if (!empty($article['author'])) {
$html .= '作者:' . htmlspecialchars($article['author']) . '';
}
$html .= '
';
$html .= '
';
$html .= '
';
}
return $html;
}
// 处理AJAX请求
if ($action === 'ajax') {
header('Content-Type: application/json; charset=utf-8');
$type = isset($_GET['type']) ? $_GET['type'] : 'sec-news';
$dateFilter = isset($_GET['date']) ? $_GET['date'] : '';
$limit = isset($_GET['limit']) ? intval($_GET['limit']) : 50;
$db = getDatabaseConnection($dbPath);
if (!$db) {
echo json_encode(['success' => false, 'message' => '数据库连接失败']);
exit;
}
$data = [];
$title = '';
switch ($type) {
case 'sec-news':
$data = getSecNews($db, $dateFilter, $limit);
$title = '🔒 安全新闻';
break;
case 'tech-passage':
$data = getTechPassage($db, $dateFilter, $limit);
$title = '💻 技术文章';
break;
case 'baidu-news':
$data = getBaiduNews($db, $dateFilter, $limit);
$title = '📊 百度新闻';
break;
case 'github-news':
$data = getGithubNews($db, $dateFilter, $limit);
$title = '🐙 GitHub动态';
break;
case 'wx-news':
$data = getWxNews($db, $dateFilter, $limit);
$title = '💬 微信文章';
break;
case 'other-rss':
$data = getOtherRss($db, $dateFilter, $limit);
$title = '📡 其他来源';
break;
default:
echo json_encode(['success' => false, 'message' => '无效的类型']);
exit;
}
echo json_encode([
'success' => true,
'title' => $title,
'count' => count($data),
'data' => $data
]);
exit;
}
// 获取初始数据(默认显示安全新闻)
$db = getDatabaseConnection($dbPath);
$initialData = [];
$initialTitle = '🔒 安全新闻';
if ($db) {
$initialData = getSecNews($db, $dateFilter, $limit);
}
?>
SecPulse Web端