From a82f234853b4b6d668b57e2fe096882567228e4e Mon Sep 17 00:00:00 2001 From: hellcat Date: Sat, 12 Sep 2026 16:32:37 +0800 Subject: [PATCH] no message --- app/Http/Controllers/RobotsController.php | 30 ++++++++++++++++++++ app/Http/Controllers/SitemapController.php | 33 ++++++++++++++++++++++ app/Models/Articles.php | 25 ++++++++++++++++ public/robots.txt | 2 -- resources/views/sitemap.blade.php | 19 +++++++++++++ routes/web.php | 5 ++++ 6 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 app/Http/Controllers/RobotsController.php create mode 100644 app/Http/Controllers/SitemapController.php delete mode 100755 public/robots.txt create mode 100755 resources/views/sitemap.blade.php diff --git a/app/Http/Controllers/RobotsController.php b/app/Http/Controllers/RobotsController.php new file mode 100644 index 00000000..55756f6a --- /dev/null +++ b/app/Http/Controllers/RobotsController.php @@ -0,0 +1,30 @@ +header('Content-Type', 'text/plain'); + } +} diff --git a/app/Http/Controllers/SitemapController.php b/app/Http/Controllers/SitemapController.php new file mode 100644 index 00000000..9ddbe704 --- /dev/null +++ b/app/Http/Controllers/SitemapController.php @@ -0,0 +1,33 @@ +whereHas('oCategory', function ($q) { + $q->where(function ($query) { + // 1. 没有配置 noindexday,或者 noindexday = 0 的文章,一直保留 + $query->whereNull('aOpt') + ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(aOpt, '$.noindexday')) IS NULL") + ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(aOpt, '$.noindexday')) = '0'") + // 2. 配置了天数的,只取 N 天内创建的新文章 + ->orWhereRaw("articles.created_at >= NOW() - INTERVAL CAST(JSON_UNQUOTE(JSON_EXTRACT(aOpt, '$.noindexday')) AS UNSIGNED) DAY"); + }); + }) + ->orderBy('created_at', 'desc') + ->get(); + + $sXmlContent = view('sitemap', [ + 'cArticles' => $cArticles + ])->render(); + + return response($sXmlContent, 200)->header('Content-Type', 'text/xml'); + } +} diff --git a/app/Models/Articles.php b/app/Models/Articles.php index 1e0f0697..04ec8e46 100755 --- a/app/Models/Articles.php +++ b/app/Models/Articles.php @@ -76,6 +76,31 @@ public function toSearchableArray(): array 'updated_at' => (int) $this->updated_at->timestamp, ]; } + + /** + * 判断当前文章是否超过分类设置的 SEO 暴露天数 + * @return bool + */ + public function bIsSeoExpired(): bool + { + $oCategory = $this->oCategory; + + // 未关联分类,或分类下的 aOpt 没设置,默认不处理(不过期) + if (!$oCategory || empty($oCategory->aOpt) || !isset($oCategory->aOpt['noindexday'])) { + return false; + } + + $iNoindexDay = (int) $oCategory->aOpt['noindexday']; + + // 0 或负数代表不限制,一直暴露给搜索引擎 + if ($iNoindexDay <= 0) { + return false; + } + + // 判断文章创建时间是否早于 N 天前 + $oCreateDate = \Carbon\Carbon::parse($this->created_at); + return $oCreateDate->lt(\Carbon\Carbon::now()->subDays($iNoindexDay)); + } protected static function booted() { diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100755 index eb053628..00000000 --- a/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: diff --git a/resources/views/sitemap.blade.php b/resources/views/sitemap.blade.php new file mode 100755 index 00000000..0ef0ab41 --- /dev/null +++ b/resources/views/sitemap.blade.php @@ -0,0 +1,19 @@ +{!! '<' . '?xml version="1.0" encoding="UTF-8"?' . '>' !!} + + {{-- 首页 --}} + + {{ config('app.url') }} + 1.0 + daily + + + {{-- 未过期的文章 --}} + @foreach($cArticles as $oArticles) + + {{ config('app.url') }}/a/{{ $oArticles->sSlug }}.html + {{ \Carbon\Carbon::parse($oArticles->updated_at)->tz('UTC')->toAtomString() }} + 0.8 + daily + + @endforeach + diff --git a/routes/web.php b/routes/web.php index 357663cc..7d58fcce 100755 --- a/routes/web.php +++ b/routes/web.php @@ -9,6 +9,11 @@ use App\Http\Controllers\Web\ArticlesController; use App\Http\Controllers\Api\v1\ArticlesController as ApiV1ArticlesController; use App\Http\Controllers\Api\v1\FreenodeController as ApiV1FreenodeController; +use App\Http\Controllers\RobotsController; +use App\Http\Controllers\SitemapController; + +Route::get('robots.txt', [RobotsController::class, 'index']); +Route::get('sitemap.xml', [SitemapController::class, 'index']); Route::get('/test/hello', [TestController::class, 'hello']); // 找个控制器为什么无效了 Route::get('/test/test1', [TestController::class, 'test1']);