This commit is contained in:
f4ilji
2025-01-15 15:31:37 +05:00
parent 45e73e27a0
commit bad611eb84
27 changed files with 815 additions and 124 deletions
+71 -48
View File
@@ -28,82 +28,103 @@ class ClientPostController extends Controller
{
public function index(Request $request)
{
$tagIds = DB::table('taggables')
->distinct()
->select('tag_id')
->where('taggable_type', Post::class)
->get()
->pluck('tag_id');
// Кешируем список тегов
$tagIds = Cache::remember('tag_ids', now()->addHours(1), function () {
return DB::table('taggables')
->distinct()
->select('tag_id')
->where('taggable_type', Post::class)
->get()
->pluck('tag_id');
});
$tags = \Spatie\Tags\Tag::whereIn('id', $tagIds)->get();
$posts = ClientPostListResource::collection(Post::query()
->with('category')
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'publish_at')
->where('status', '=', 'published')
->where('publish_at', '<', Carbon::now())
->when(request()->input('search'), function ($query, $search) {
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
})
->when(request()->input('category'), function ($query) {
$slugs = request()->input('category');
if (is_array($slugs)) {
$query->whereHas('category', function ($query) use ($slugs) {
$query->whereIn('slug', $slugs);
});
}
})
->when(request()->input('tag'), function ($query, $slugs) {
if (is_array($slugs)) {
return $query->withAnyTags($slugs);
}
// Кешируем теги
$tags = Cache::remember('tags', now()->addHours(1), function () use ($tagIds) {
return \Spatie\Tags\Tag::whereIn('id', $tagIds)->get();
});
$slugsArray = explode(',', $slugs);
return $query->withAnyTags($slugsArray);
})
->orderBy('publish_at', request()->input('sort', 'desc'))
// Кешируем посты с учетом фильтров
$cacheKey = 'posts_' . md5(serialize($request->all()));
$posts = Cache::remember($cacheKey, now()->addHours(1), function () use ($request) {
return ClientPostListResource::collection(Post::query()
->with('category')
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'publish_at')
->where('status', '=', 'published')
->where('publish_at', '<', Carbon::now())
->when($request->input('search'), function ($query, $search) {
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
})
->when($request->input('category'), function ($query) use ($request) {
$slugs = $request->input('category');
if (is_array($slugs)) {
$query->whereHas('category', function ($query) use ($slugs) {
$query->whereIn('slug', $slugs);
});
}
})
->when($request->input('tag'), function ($query, $slugs) {
if (is_array($slugs)) {
return $query->withAnyTags($slugs);
}
->paginate(6)
->withQueryString());
$slugsArray = explode(',', $slugs);
return $query->withAnyTags($slugsArray);
})
->orderBy('publish_at', $request->input('sort', 'desc'))
->paginate(6)
->withQueryString());
});
$categories = CategoryResource::collection(Category::has('posts')->get());
// Кешируем категории
$categories = Cache::remember('categories', now()->addHours(48), function () {
return CategoryResource::collection(Category::has('posts')->get());
});
// Кешируем контент категорий
$categoriesContent = [];
if (request()->input('category')) {
foreach (request()->input('category') as $item) {
$categoriesContent[$item] = new CategoryResource(Category::where('slug', $item)->first());
if ($request->input('category')) {
foreach ($request->input('category') as $item) {
$cacheKey = 'category_content_' . $item;
$categoriesContent[$item] = Cache::remember($cacheKey, now()->addHours(1), function () use ($item) {
return new CategoryResource(Category::where('slug', $item)->first());
});
}
}
// Кешируем контент тегов
$tagsContent = [];
if (request()->input('tag')) {
foreach (request()->input('tag') as $item) {
$tagsContent[$item] = new ClientTagResource(DB::table('tags')
->where(DB::raw("JSON_UNQUOTE(JSON_EXTRACT(slug, '$.ru'))"), $item)
->first());
if ($request->input('tag')) {
foreach ($request->input('tag') as $item) {
$cacheKey = 'tag_content_' . $item;
$tagsContent[$item] = Cache::remember($cacheKey, now()->addHours(1), function () use ($item) {
return new ClientTagResource(DB::table('tags')
->where(DB::raw("JSON_UNQUOTE(JSON_EXTRACT(slug, '$.ru'))"), $item)
->first());
});
}
}
$filters = [
'search_filter' => [
'type' => 'search',
'value' => request()->input('search'),
'value' => $request->input('search'),
'param' => 'search'
],
'category_filter' => [
'type' => 'category',
'value' => request()->input('category'),
'value' => $request->input('category'),
'param' => 'category',
'content' => $categoriesContent,
],
'tag_filter' => [
'type' => 'tag',
'value' => request()->input('tag'),
'value' => $request->input('tag'),
'param' => 'tag',
'content' => $tagsContent
],
'sortingBy_filter' => [
'type' => 'sort',
'value' => request()->input('sort'),
'value' => $request->input('sort'),
'param' => 'sort',
],
];
@@ -111,7 +132,10 @@ class ClientPostController extends Controller
$routeUrl = route('client.post.index');
$path = ltrim(parse_url($routeUrl, PHP_URL_PATH), '/');
$page = Page::where('path', '=', $path)->with('section.pages.section', 'section.mainSection')->first();
// Кешируем страницу
$page = Cache::remember('page_' . $path, now()->addHours(1), function () use ($path) {
return Page::where('path', '=', $path)->with('section.pages.section', 'section.mainSection')->first();
});
if (isset($page->section)) {
$breadcrumbs = [
@@ -123,7 +147,6 @@ class ClientPostController extends Controller
$breadcrumbs = null;
}
return Inertia::render('Client/Posts/Index', compact('filters', 'posts', 'categories', 'tags', 'breadcrumbs'));
}
@@ -29,9 +29,6 @@ class ClientWidgetFormController extends Controller
$messages = $this->generateValidationMessages($data['columns']);
$validateData = Validator::make($request->all(), $rules, $messages);
@@ -6,14 +6,21 @@ use App\Http\Resources\ClientPageNavigateResource;
use App\Http\Resources\PageResource;
use App\Models\Page;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class ClientWidgetPageController extends Controller
{
public function single(int $id)
{
$page = Page::query()
->with('section')
->find($id);
$cacheKey = 'page_' . md5($id);
// Пытаемся получить данные из кеша
$page = Cache::remember($cacheKey, now()->addHours(1), function () use ($id) {
return Page::where('id', '=', $id)
->with('section.pages.section', 'section.mainSection')
->first();
});
if (isset($page->section)) {
$breadcrumbs = [
'mainSection' => $page->section->mainSection->title,
@@ -7,27 +7,40 @@ use App\Http\Resources\ClientPostListResource;
use App\Http\Resources\PostThumbnailResource;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
class ClientWidgetPostController extends Controller
{
public function index()
{
return PostThumbnailResource::collection(
Post::query()
->where('status', PostStatus::PUBLISHED)
->when(request()->input('category'), function ($query, $category_id) {
$query->where('category_id', $category_id);
})
->with('category')
->orderBy('publish_at', 'desc')
->take(request()->input('count', 5))
->get());
$category_id = request()->input('category');
$count = request()->input('count', 5);
$cacheKey = 'posts_' . $category_id . '_' . $count;
return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($category_id, $count) {
return PostThumbnailResource::collection(
Post::query()
->where('status', PostStatus::PUBLISHED)
->when($category_id, function ($query, $category_id) {
$query->where('category_id', $category_id);
})
->with('category')
->orderBy('publish_at', 'desc')
->take($count)
->get()
);
});
}
public function single(int $id)
{
return new PostThumbnailResource(
Post::query()->with('category')->find($id)
);
$cacheKey = 'post_' . $id;
return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($id) {
return new PostThumbnailResource(
Post::query()->with('category')->find($id)
);
});
}
}
@@ -0,0 +1,57 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class ImportUserController extends Controller
{
public function index()
{
return User::query()->whereHas('userDetail')->with('userDetail')->get();
}
public function test()
{
$response = Http::get('http://crawdad-fresh-bream.ngrok-free.app/api/import/users/')->object();
foreach ($response as $user) {
$userDetail = $user->user_detail;
unset($user->user_detail);
$user = User::create([
'name' => $user->name,
'slug' => $user->slug,
'email' => $user->email,
'email_verified_at' => $user->email_verified_at,
'password' => Md5(Str::random(15)),
'remember_token' => null,
'created_at' => $user->created_at,
'updated_at' => $user->updated_at,
]);
$user->userDetail()->create([
'user_id' => $user->id,
'is_only_worker' => $userDetail->is_only_worker,
'photo' => $userDetail->photo,
'academicTitle' => $userDetail->academicTitle,
'AcademicDegree' => $userDetail->AcademicDegree,
'education' => $userDetail->education,
'awards' => $userDetail->awards,
'professDisciplines' => $userDetail->professDisciplines,
'professionalRetraining' => $userDetail->professionalRetraining,
'professionalDevelopment' => $userDetail->professionalDevelopment,
'workExperience' => $userDetail->workExperience,
'attendedConferences' => $userDetail->attendedConferences,
'participationScienceProjects' => $userDetail->participationScienceProjects,
'publications' => $userDetail->publications,
'contactEmail' => $userDetail->contactEmail,
'contactPhone' => $userDetail->contactPhone,
'search_data' => $userDetail->search_data,
'other' => $userDetail->other,
'created_at' => $userDetail->created_at,
'updated_at' => $userDetail->updated_at,
]);
}
}
}
+2 -2
View File
@@ -22,13 +22,13 @@ use Inertia\Inertia;
class PageController extends Controller
{
public function render($path)
public function render(Request $request, $path)
{
// Генерируем уникальный ключ для кеширования
$cacheKey = 'page_' . md5($path);
// Пытаемся получить данные из кеша
$page = Cache::remember($cacheKey, now()->addHours(1), function () use ($path) {
$page = Cache::remember($cacheKey, now()->addHours(48), function () use ($path) {
return Page::where('path', '=', $path)
->with('section.pages.section', 'section.mainSection')
->first();