当前位置: 首页 > news >正文

semcms外贸网站管理系统军事新闻 今日关注

semcms外贸网站管理系统,军事新闻 今日关注,百度权重排名查询,衡水做网站企业以下将详细介绍当歌平台的技术架构、功能实现以及相关代码逻辑。 一、项目概述 当歌是一个极简的 RSS 订阅分发平台,旨在为用户提供便捷的 RSS 管理和订阅服务,帮助用户轻松获取和分享最新资讯。 二、技术架构 后端语言:PHP 数据库&#…

以下将详细介绍当歌平台的技术架构、功能实现以及相关代码逻辑。
微信图片_20250108191058.png

一、项目概述

当歌是一个极简的 RSS 订阅分发平台,旨在为用户提供便捷的 RSS 管理和订阅服务,帮助用户轻松获取和分享最新资讯。

二、技术架构

后端语言:PHP
数据库MySQL,通过 PDO(PHP Data Objects)进行连接和操作,配置信息如下:

$host = 'localhost';
$db = 'rss';
$user = 'rss';
$pass = '123456';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,PDO::ATTR_EMULATE_PREPARES => false,
];
try {$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {throw new \PDOException($e->getMessage(), (int)$e->getCode());
}

**邮件发送:**使用 PHPMailer 库来实现邮件发送功能,用于发送验证码和订阅推送邮件。

三、功能模块

(一)用户认证与登录

index.phpadd_rss.php 等多个页面中,通过 session_start() 启动会话,并检查 $_SESSION['username'] 是否存在来判断用户是否登录。例如在 index.php 中:

session_start();
$isLoggedIn = isset($_SESSION['username']);

如果用户已登录,导航栏会显示用户名及退出登录选项;未登录时则显示登录和注册链接。

(二)订阅管理

添加订阅
微信图片_20250108191151.png
add_rss.php 中,首先获取用户 ID,若用户未登录则提示先登录。然后检查用户是否已有密钥,若无则生成一个新的密钥并存储到 user_keys 表中。
当用户提交 RSS URL 时,会检查是否已订阅该 URL,若未订阅且 URL 可访问,则将订阅信息插入到 subscriptions 表中,并触发 update_rss.php 进行 RSS 内容更新。
部分关键代码如下:

// 获取用户ID
$stmt = $pdo->prepare('SELECT id FROM users WHERE username =?');
$stmt->execute([$username]);
$user = $stmt->fetch();
$userId = $user['id'];// 检查用户是否已有密钥
$stmt = $pdo->prepare('SELECT user_key FROM user_keys WHERE user_id =?');
$stmt->execute([$userId]);
$userKey = $stmt->fetchColumn();
if (!$userKey) {// 生成新密钥并插入$userKey = bin2hex(random_bytes(16));$stmt = $pdo->prepare('INSERT INTO user_keys (user_id, user_key) VALUES (?,?)');$stmt->execute([$userId, $userKey]);
}// 处理添加订阅请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['rss_url'])) {$rssUrl = $_POST['rss_url']?? '';if ($rssUrl && $userId) {// 检查是否已订阅$stmt = $pdo->prepare('SELECT COUNT(*) FROM subscriptions WHERE user_id =? AND rss_url =?');$stmt->execute([$userId, $rssUrl]);$count = $stmt->fetchColumn();if ($count > 0) {echo "<div class='alert alert-warning'>您已订阅此 RSS 源</div>";} else {// 验证 RSS URL 是否可访问$rss = @simplexml_load_file($rssUrl);if ($rss) {// 添加订阅关系$stmt = $pdo->prepare('INSERT INTO subscriptions (user_id, rss_url) VALUES (?,?)');$stmt->execute([$userId, $rssUrl]);// 触发更新$updateUrl = "https://dang.ge/update_rss.php?key={$userKey}";$response = @file_get_contents($updateUrl);if ($response === FALSE) {echo "<div class='alert alert-danger'>无法调用更新服务,请检查配置。</div>";} else {echo "<div class='alert alert-success'>订阅添加成功,并已更新。</div>";}// 刷新页面header("Location: add_rss.php");exit;} else {echo "<div class='alert alert-danger'>无法访问该 RSS 源,请检查 URL 是否正确</div>";}}}
}

删除订阅
微信图片_20250108191236.png
当用户提交要删除的 RSS URL 时,会从 subscriptions 表和 rss_items 表中删除相关记录,并刷新页面以反映删除操作。
代码示例:

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_rss_url'])) {$rssUrlToDelete = $_POST['delete_rss_url']?? '';if ($rssUrlToDelete && $userId) {$stmt = $pdo->prepare('DELETE FROM subscriptions WHERE user_id =? AND rss_url =?');$stmt->execute([$userId, $rssUrlToDelete]);// 删除相关 RSS 内容$stmt = $pdo->prepare('DELETE FROM rss_items WHERE user_id =? AND rss_url =?');$stmt->execute([$userId, $rssUrlToDelete]);// 刷新页面header("Location: add_rss.php");exit;}
}

订阅列表展示
subscriptions 表中获取用户的订阅信息,并在页面上以列表形式展示,每个订阅项包含订阅源标题和删除按钮。点击订阅源标题可查看该订阅的内容。
相关代码如下:

// 获取订阅信息
$stmt = $pdo->prepare('SELECT rss_url FROM subscriptions WHERE user_id =?');
$stmt->execute([$userId]);
$subscriptions = $stmt->fetchAll();// 展示订阅列表
foreach ($subscriptions as $subscription) {$rssUrl = $subscription['rss_url'];$rss = simplexml_load_file($rssUrl);$channelTitle = $rss->channel->title?? $rss->title?? '未知标题';?><li class="list-group-item d-flex justify-content-between align-items-center"><form method="post" action="" class="d-inline"><input type="hidden" name="selected_rss" value="<?php echo htmlspecialchars($rssUrl);?>"><button type="submit" class="btn btn-link p-0"><?php echo htmlspecialchars($channelTitle);?></button></form><form method="post" action="" class="d-inline"><input type="hidden" name="delete_rss_url" value="<?php echo htmlspecialchars($rssUrl);?>"><button type="submit" class="btn btn-danger btn-sm">删除</button></form></li><?php
}

(三)RSS 内容更新与推送

更新机制
update_rss.php 中,根据用户密钥获取用户 ID,然后获取用户的所有订阅 RSS URL。对于每个 URL,先加载 RSS 内容,检测其格式(Atom 或其他)并获取条目。
接着获取已存在的链接,对比新条目链接,若不存在则插入到 rss_items 表中,并构建邮件内容。
关键代码如下:

$key = $_GET['key']?? null;
if (!$key) {echo "无效的请求";exit;
}
// 验证密钥
$stmt = $pdo->prepare('SELECT user_id FROM user_keys WHERE user_key =?');
$stmt->execute([$key]);
$userKey = $stmt->fetch();
if (!$userKey) {echo "无效的密钥";exit;
}
$userId = $userKey['user_id'];// 获取用户的订阅
$stmt = $pdo->prepare('SELECT DISTINCT rss_url FROM subscriptions WHERE user_id =?');
$stmt->execute([$userId]);
$rssUrls = $stmt->fetchAll();foreach ($rssUrls as $rssUrl) {$url = $rssUrl['rss_url'];$rss = @simplexml_load_file($url);if ($rss) {// 检测格式并获取条目$isAtom = $rss->getNamespaces(true)[''] === 'http://www.w3.org/2005/Atom';$items = $isAtom? ($rss->entry?? []) : ($rss->channel->item?? []);// 获取已存在链接$stmt = $pdo->prepare('SELECT link FROM rss_items WHERE user_id =? AND rss_url =?');$stmt->execute([$userId, $url]);$existingLinks = $stmt->fetchAll(PDO::FETCH_COLUMN);$newCount = 0;$skipCount = 0;$emailBody = "<h1>当歌 Rss 订阅推送</h1><ul>";foreach ($items as $item) {// 获取链接及其他字段$link = $isAtom? (string)($item->link['href']?? $item->link?? '#') : (string)($item->link?? '#');if (in_array($link, $existingLinks)) {$skipCount++;continue;}$title = (string)($item->title?? '无标题');$content = $isAtom? (string)($item->content?? $item->summary?? '') : (string)($item->{'content:encoded'}?? $item->description?? '');$pubDate = $isAtom? (string)($item->published?? $item->updated?? date('Y-m-d H:i:s')) : (string)($item->pubDate?? date('Y-m-d H:i:s'));try {$timestamp = strtotime($pubDate);$formattedDate = $timestamp? date('Y-m-d H:i:s', $timestamp) : date('Y-m-d H:i:s');// 插入新记录$stmt = $pdo->prepare('INSERT INTO rss_items (user_id, rss_url, title, link, description, pub_date) VALUES (?,?,?,?,?,?)');$stmt->execute([$userId,$url,$title,$link,$content,$formattedDate]);$newCount++;$emailBody.= "<li><strong>文章标题:</strong> {$title}<br>"."<strong>发布时间:</strong> {$formattedDate}<br>"."<strong>文章地址:</strong> <a href='{$link}'>查看原文</a></li>";} catch (PDOException $e) {error_log("插入 RSS 条目失败: ". $e->getMessage());continue;}}$emailBody.= "</ul>";// 检查是否首次执行及发送邮件//...}
}

邮件推送
若有新内容且不是首次执行,获取用户主邮箱和所有订阅邮箱,合并去重后,使用 PHPMailer 发送邮件通知,邮件内容包含新文章的标题、发布时间和链接。

(四)邮件订阅功能

订阅流程
微信图片_20250108191328.png
subscribe.php 中,首先根据传入的密钥获取用户 ID用户名,然后展示用户的订阅标题信息。
当用户提交邮箱时,会检查是否在冷却时间内(60 秒),若不在则发送验证码到邮箱,并记录相关信息到会话中。
当用户提交验证码时,会验证验证码是否正确,若正确则将订阅信息插入到 email_subscriptions 表中。
关键代码如下:

$key = $_GET['key']?? null;
if (!$key) {echo "<div class='alert alert-danger'>无效的请求</div>";exit;
}
// 验证密钥
$stmt = $pdo->prepare('SELECT user_id FROM user_keys WHERE user_key =?');
$stmt->execute([$key]);
$userKey = $stmt->fetch();
if (!$userKey) {echo "<div class='alert alert-danger'>无效的密钥</div>";exit;
}
$userId = $userKey['user_id'];// 获取用户名
$stmt = $pdo->prepare('SELECT username FROM users WHERE id =?');
$stmt->execute([$userId]);
$user = $stmt->fetch();
$keyUsername = $user['username'];// 获取订阅标题
$stmt = $pdo->prepare('SELECT title, pub_date FROM rss_items WHERE user_id =? ORDER BY pub_date DESC LIMIT 5');
$stmt->execute([$userId]);
$subscriptions = $stmt->fetchAll();if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['email'])) {$currentTime = time();if ($currentTime - $lastRequestTime < $cooldown) {$message = "<div class='alert alert-warning'>请稍后 60 秒后再试。</div>";} else {$email = $_POST['email'];$verificationCode = rand(100000, 999999);// 发送验证码邮件$mail = new PHPMailer(true);try {$mail->isSMTP();$mail->Host ='smtp.163.com';$mail->SMTPAuth = true;$mail->Username = 'xxxxx@163.com';$mail->Password = 'xxxxx';$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;$mail->Port = 25;$mail->CharSet = 'UTF-8';$mail->setFrom('xxxxx@163.com', 'RSS Notifier');$mail->addAddress($email);$mail->isHTML(true);$mail->Subject = '当歌 Rss 订阅平台订阅验证码';$mail->Body = "您的验证码是:<strong>{$verificationCode}</strong>";$mail->send();$message = "<div class='alert alert-success'>验证码已发送到您的邮箱,请查收。</div>";$showVerification = true;$_SESSION['last_request_time'] = $currentTime;} catch (Exception $e) {$message = "<div class='alert alert-danger'>邮件发送失败: {$mail->ErrorInfo}</div>";}$_SESSION['verification_code'] = $verificationCode;$_SESSION['email'] = $email;}
}if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['verification_code'])) {$inputCode = $_POST['verification_code'];if ($inputCode == $_SESSION['verification_code']) {// 验证成功,订阅$stmt = $pdo->prepare('INSERT INTO email_subscriptions (user_id, email, key_username, subscribed_at) VALUES (?,?,?, NOW())');$stmt->execute([$userId, $_SESSION['email'], $keyUsername]);$message = "<div class='alert alert-success'>订阅成功!</div>";} else {$message = "<div class='alert alert-danger'>验证码错误,请重试。</div>";}
}

平台地址

Dang.Ge


文章转载自:
http://wanjiaunido.xzLp.cn
http://wanjiaindraft.xzLp.cn
http://wanjiavertebrate.xzLp.cn
http://wanjiacopremia.xzLp.cn
http://wanjialaundering.xzLp.cn
http://wanjialabber.xzLp.cn
http://wanjiagauntry.xzLp.cn
http://wanjiaspherometer.xzLp.cn
http://wanjiastarlit.xzLp.cn
http://wanjiaprealtar.xzLp.cn
http://wanjialug.xzLp.cn
http://wanjiasecretin.xzLp.cn
http://wanjiapresently.xzLp.cn
http://wanjialiberality.xzLp.cn
http://wanjiacentesimal.xzLp.cn
http://wanjiaspenserian.xzLp.cn
http://wanjiamuddily.xzLp.cn
http://wanjiapreequalization.xzLp.cn
http://wanjiacranioplasty.xzLp.cn
http://wanjiacommutate.xzLp.cn
http://wanjiamacrodontia.xzLp.cn
http://wanjiahdcopy.xzLp.cn
http://wanjiadefrayal.xzLp.cn
http://wanjiachicken.xzLp.cn
http://wanjiaor.xzLp.cn
http://wanjiahitlerian.xzLp.cn
http://wanjiacurtsey.xzLp.cn
http://wanjiaenjoinder.xzLp.cn
http://wanjiapumpman.xzLp.cn
http://wanjiavelamen.xzLp.cn
http://wanjiacaesural.xzLp.cn
http://wanjiasyphilis.xzLp.cn
http://wanjiafalsification.xzLp.cn
http://wanjiareink.xzLp.cn
http://wanjiarelaxation.xzLp.cn
http://wanjiaprecalculus.xzLp.cn
http://wanjiabarstool.xzLp.cn
http://wanjiajournalist.xzLp.cn
http://wanjiabailsman.xzLp.cn
http://wanjiauto.xzLp.cn
http://wanjiabulbar.xzLp.cn
http://wanjialocalizer.xzLp.cn
http://wanjiatromba.xzLp.cn
http://wanjiawithershins.xzLp.cn
http://wanjiashareable.xzLp.cn
http://wanjiawealth.xzLp.cn
http://wanjiachinghai.xzLp.cn
http://wanjiazmodem.xzLp.cn
http://wanjiasauroid.xzLp.cn
http://wanjiatherefore.xzLp.cn
http://wanjiaautecologically.xzLp.cn
http://wanjiagalant.xzLp.cn
http://wanjiadispersant.xzLp.cn
http://wanjiaaeroengine.xzLp.cn
http://wanjialandmass.xzLp.cn
http://wanjiahardcover.xzLp.cn
http://wanjiafaecula.xzLp.cn
http://wanjiamordancy.xzLp.cn
http://wanjiamalvina.xzLp.cn
http://wanjiadraco.xzLp.cn
http://wanjiaexult.xzLp.cn
http://wanjiajank.xzLp.cn
http://wanjiacoleseed.xzLp.cn
http://wanjiamuffler.xzLp.cn
http://wanjiamoonfish.xzLp.cn
http://wanjiablighter.xzLp.cn
http://wanjiapremiate.xzLp.cn
http://wanjiasolarize.xzLp.cn
http://wanjiaatlantic.xzLp.cn
http://wanjiaunwell.xzLp.cn
http://wanjiaracking.xzLp.cn
http://wanjiabookie.xzLp.cn
http://wanjiaspilosite.xzLp.cn
http://wanjiaopiatic.xzLp.cn
http://wanjiatrophallaxis.xzLp.cn
http://wanjiaunpunishable.xzLp.cn
http://wanjiavaricocelectomy.xzLp.cn
http://wanjiaolfactometer.xzLp.cn
http://wanjiahogshead.xzLp.cn
http://wanjiaestimation.xzLp.cn
http://www.15wanjia.com/news/113794.html

相关文章:

  • vps主机可以做几个网站互联网媒体推广
  • 如何建设网站的外接 以及在增加外接的时应当注意什么百度小说风云榜今天
  • 江苏 网站建设sem公司
  • 怎么用自己电脑做网站百度网盟推广
  • 黑客基础菜鸟入门教程seo外包如何
  • 网站建设与推广站长工具同大全站
  • 爱做网站免费网络推广怎么做?
  • 网页超链接到别的网站404深圳网站做优化哪家公司好
  • 17网站一起做网店可靠吗软文新闻发布平台
  • 求网站建设和网页设计的电子书网易疫情实时最新数据
  • 管理咨询公司经营范围seo专员招聘
  • 提供做网站公司电商培训机构靠谱吗
  • 网站建设技术参数seo站内优化技巧
  • 苏州建设局网站实名制网页设计一般用什么软件
  • webform网站开发经历免费的云服务器有哪些
  • 辽宁住房和城乡建设厅网站怎么免费建立网站
  • 怎么做淘宝客网站赚钱吗收录批量查询
  • 自己如何做棋牌网站免费网站可以下载
  • dedecms网站重庆seo网络推广关键词
  • 免费做任务赚钱的网站著名的营销成功的案例
  • 网络工程师和网站开发员广告模板
  • ionic3 做网站chrome谷歌浏览器
  • 黄岩网站建设搜索推广和信息流推广的区别
  • 设计素材网站千图网班级优化大师使用心得
  • 南充商城网站建设厦门人才网官网
  • python怎么做网站网站关键词排名优化客服
  • 中国银行建设网站首页100大看免费行情的软件
  • wordpress 分享实现武汉seo优化排名公司
  • 做鞋用什么网站好个人免费网站申请注册
  • 做的比较好的车载嗨曲网站厦门百度公司