Files
Tstore/app/Http/Controllers/Web/StorefrontController.php
浪子 04a2034975 前端极简黑白重设计,并纳入客户端注册、站点设置与后台相关改动
- storefront 全站改为极简黑白配色:直角、细线分隔、卡片 hover 浅底、深色模式(跟随系统+手动切换)
- 抽出 storefront/partials/card 复用卡片
- 一并提交此前暂存的客户端注册 API、站点设置、后台页面与测试

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-09-22 08:35:49 +08:00

122 lines
3.9 KiB
PHP

<?php
namespace App\Http\Controllers\Web;
use App\Http\Controllers\Controller;
use App\Models\Category;
use App\Models\Package;
use App\Services\RepoFormatter;
use Illuminate\Http\Request;
use Illuminate\View\View;
class StorefrontController extends Controller
{
public function home(): View
{
$featuredPlugins = Package::query()
->with(['categories', 'latestStableVersion'])
->where('status', 'published')
->where('type', 'plugin')
->orderByDesc('is_featured')
->orderByDesc('sort_order')
->orderByDesc('updated_at')
->limit(6)
->get();
$featuredThemes = Package::query()
->with(['categories', 'latestStableVersion'])
->where('status', 'published')
->where('type', 'theme')
->orderByDesc('is_featured')
->orderByDesc('sort_order')
->orderByDesc('updated_at')
->limit(6)
->get();
$stats = [
'packages' => Package::query()->where('status', 'published')->count(),
'plugins' => Package::query()->where('status', 'published')->where('type', 'plugin')->count(),
'themes' => Package::query()->where('status', 'published')->where('type', 'theme')->count(),
'categories' => Category::count(),
];
return view('storefront.home', compact('featuredPlugins', 'featuredThemes', 'stats'));
}
public function packages(Request $request, string $type): View
{
abort_unless(in_array($type, ['plugin', 'theme'], true), 404);
$query = Package::query()
->with(['categories', 'latestStableVersion'])
->where('status', 'published')
->where('type', $type);
if ($keyword = trim((string) $request->query('keyword', ''))) {
$query->where(function ($q) use ($keyword) {
$q->where('name', 'like', '%' . $keyword . '%')
->orWhere('slug', 'like', '%' . $keyword . '%')
->orWhere('summary', 'like', '%' . $keyword . '%');
});
}
if ($category = (string) $request->query('category', '')) {
$query->whereHas('categories', fn ($q) => $q->where('slug', $category));
}
$sort = (string) $request->query('sort', 'latest');
if ($sort === 'name') {
$query->orderBy('name');
} else {
$query->orderByDesc('is_featured')->orderByDesc('sort_order')->orderByDesc('updated_at');
}
$packages = $query->paginate(12)->withQueryString();
$categories = Category::query()->where('type', $type)->orderByDesc('sort_order')->get();
return view('storefront.packages', [
'type' => $type,
'packages' => $packages,
'categories' => $categories,
'filters' => [
'keyword' => (string) $request->query('keyword', ''),
'category' => (string) $request->query('category', ''),
'sort' => $sort,
],
]);
}
public function showPlugin(string $slug): View
{
return $this->show('plugin', $slug);
}
public function showTheme(string $slug): View
{
return $this->show('theme', $slug);
}
public function show(string $type, string $slug): View
{
abort_unless(in_array($type, ['plugin', 'theme'], true), 404);
$package = Package::query()
->with([
'categories',
'screenshots',
'versions' => fn ($q) => $q->orderByDesc('published_at')->orderByDesc('id'),
])
->where('status', 'published')
->where('type', $type)
->where('slug', $slug)
->firstOrFail();
$detail = RepoFormatter::packageDetail($package, false);
return view('storefront.show', [
'package' => $package,
'detail' => $detail,
]);
}
}