From bad611eb84ce192d5bec3f4154bee07295770580 Mon Sep 17 00:00:00 2001 From: f4ilji Date: Wed, 15 Jan 2025 15:31:37 +0500 Subject: [PATCH] Changes --- app/Http/Controllers/ClientPostController.php | 119 +++++++++++------- .../ClientWidgetFormController.php | 3 - .../ClientWidgetPageController.php | 13 +- .../ClientWidgetPostController.php | 39 ++++-- app/Http/Controllers/ImportUserController.php | 57 +++++++++ app/Http/Controllers/PageController.php | 4 +- app/Http/Kernel.php | 4 + .../Middleware/EnsureUserIsSuperadmin.php | 26 ++++ app/Http/Middleware/GenerateBreadcrumbs.php | 36 ++++++ app/Http/Middleware/InternalRequestOnly.php | 27 ++++ app/Models/Post.php | 14 +++ app/Models/User.php | 1 + app/Observers/CategoryObserver.php | 56 +++++++++ app/Observers/PageObserver.php | 18 +-- app/Observers/PostObserver.php | 34 ++--- app/Observers/TagObserver.php | 56 +++++++++ .../App/Cache/AbstractCacheService.php | 27 ++++ app/Services/App/Cache/CacheInterface.php | 33 +++++ .../App/Cache/CategoryCacheService.php | 49 ++++++++ .../App/Cache/MainSectionCacheService.php | 44 +++++++ app/Services/App/Cache/PageCacheService.php | 63 ++++++++++ app/Services/App/Cache/PostCacheService.php | 56 +++++++++ .../App/Cache/SubSectionCacheService.php | 43 +++++++ app/Services/App/Cache/TagCacheService.php | 50 ++++++++ config/database.php | 2 +- .../BuilderUi/Pages/Blocks/PostListBlock.vue | 16 ++- routes/api.php | 49 ++++---- 27 files changed, 815 insertions(+), 124 deletions(-) create mode 100644 app/Http/Controllers/ImportUserController.php create mode 100644 app/Http/Middleware/EnsureUserIsSuperadmin.php create mode 100644 app/Http/Middleware/GenerateBreadcrumbs.php create mode 100644 app/Http/Middleware/InternalRequestOnly.php create mode 100644 app/Observers/CategoryObserver.php create mode 100644 app/Observers/TagObserver.php create mode 100644 app/Services/App/Cache/AbstractCacheService.php create mode 100644 app/Services/App/Cache/CacheInterface.php create mode 100644 app/Services/App/Cache/CategoryCacheService.php create mode 100644 app/Services/App/Cache/MainSectionCacheService.php create mode 100644 app/Services/App/Cache/PageCacheService.php create mode 100644 app/Services/App/Cache/PostCacheService.php create mode 100644 app/Services/App/Cache/SubSectionCacheService.php create mode 100644 app/Services/App/Cache/TagCacheService.php diff --git a/app/Http/Controllers/ClientPostController.php b/app/Http/Controllers/ClientPostController.php index b743ad4..5c55b62 100644 --- a/app/Http/Controllers/ClientPostController.php +++ b/app/Http/Controllers/ClientPostController.php @@ -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')); } diff --git a/app/Http/Controllers/ClientWidgetFormController.php b/app/Http/Controllers/ClientWidgetFormController.php index 144a6dd..4a7aed9 100644 --- a/app/Http/Controllers/ClientWidgetFormController.php +++ b/app/Http/Controllers/ClientWidgetFormController.php @@ -29,9 +29,6 @@ class ClientWidgetFormController extends Controller $messages = $this->generateValidationMessages($data['columns']); - - - $validateData = Validator::make($request->all(), $rules, $messages); diff --git a/app/Http/Controllers/ClientWidgetPageController.php b/app/Http/Controllers/ClientWidgetPageController.php index acfb96a..502da6f 100644 --- a/app/Http/Controllers/ClientWidgetPageController.php +++ b/app/Http/Controllers/ClientWidgetPageController.php @@ -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, diff --git a/app/Http/Controllers/ClientWidgetPostController.php b/app/Http/Controllers/ClientWidgetPostController.php index 49f273f..4a29494 100644 --- a/app/Http/Controllers/ClientWidgetPostController.php +++ b/app/Http/Controllers/ClientWidgetPostController.php @@ -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) + ); + }); } } diff --git a/app/Http/Controllers/ImportUserController.php b/app/Http/Controllers/ImportUserController.php new file mode 100644 index 0000000..a0d6c3b --- /dev/null +++ b/app/Http/Controllers/ImportUserController.php @@ -0,0 +1,57 @@ +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, + ]); + } + } +} diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index d48ea22..c4a7c0a 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -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(); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 34669e3..d2c0eb7 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -3,6 +3,7 @@ namespace App\Http; use App\Http\Middleware\AccessCheck; +use App\Http\Middleware\InternalRequestOnly; use App\Http\Middleware\RateLimitCheckMiddleware; use App\Http\Middleware\RateLimitCounterMiddleware; use Illuminate\Foundation\Http\Kernel as HttpKernel; @@ -81,5 +82,8 @@ class Kernel extends HttpKernel 'access-check' => AccessCheck::class, 'rate.limited.counter' => RateLimitCounterMiddleware::class, 'rate.limited.check' => RateLimitCheckMiddleware::class, + 'ensure.browser' => InternalRequestOnly::class, + 'superadmin' => \App\Http\Middleware\EnsureUserIsSuperadmin::class, + ); } diff --git a/app/Http/Middleware/EnsureUserIsSuperadmin.php b/app/Http/Middleware/EnsureUserIsSuperadmin.php new file mode 100644 index 0000000..12ce0dd --- /dev/null +++ b/app/Http/Middleware/EnsureUserIsSuperadmin.php @@ -0,0 +1,26 @@ +hasRole('super_admin')) { + return response('Access denied. You do not have permission to access this route.', 403); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/GenerateBreadcrumbs.php b/app/Http/Middleware/GenerateBreadcrumbs.php new file mode 100644 index 0000000..067d8ca --- /dev/null +++ b/app/Http/Middleware/GenerateBreadcrumbs.php @@ -0,0 +1,36 @@ +path(); + $page = Page::where('path', '=', $path) + ->with('section.pages.section', 'section.mainSection') + ->first(); + + if ($page && isset($page->section)) { + $breadcrumbs = [ + 'mainSection' => new ClientBreadcrumbSection($page->section->mainSection), + 'subSection' => new ClientBreadcrumbSubSection($page->section), + 'page' => new ClientBreadcrumbPage($page), + ]; + } else { + $breadcrumbs = null; + } + + $request->merge(['breadcrumbs' => $breadcrumbs]); + + return $next($request); + } +} diff --git a/app/Http/Middleware/InternalRequestOnly.php b/app/Http/Middleware/InternalRequestOnly.php new file mode 100644 index 0000000..c41bb9b --- /dev/null +++ b/app/Http/Middleware/InternalRequestOnly.php @@ -0,0 +1,27 @@ +header('User-Agent'); + + // Проверяем, что User-Agent содержит ключевые слова, характерные для браузеров + if (!preg_match('/Mozilla|Chrome|Safari|Firefox|Edge/i', $userAgent)) { + return response('Access denied. This route is available only from a web browser.', 403); + } + + return $next($request); + } +} diff --git a/app/Models/Post.php b/app/Models/Post.php index d6087a9..1a8eba8 100644 --- a/app/Models/Post.php +++ b/app/Models/Post.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Support\Facades\Cache; use Spatie\Tags\HasTags; class Post extends Model @@ -15,6 +16,19 @@ class Post extends Model protected $guarded = false; + protected static function booted() + { + static::saved(function ($post) { + Cache::forget('post_' . $post->id); + Cache::forget('posts_' . $post->category_id . '_*'); // Очистка кеша для всех постов в категории + }); + + static::deleted(function ($post) { + Cache::forget('post_' . $post->id); + Cache::forget('posts_' . $post->category_id . '_*'); // Очистка кеша для всех постов в категории + }); + } + public function category() : BelongsTo { return $this->belongsTo(Category::class); diff --git a/app/Models/User.php b/app/Models/User.php index c7de675..f7a35d8 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -72,6 +72,7 @@ class User extends Authenticatable implements FilamentUser return $this->belongsToMany(Division::class, 'division_user')->withPivot(['administrativePosition']); } + public function faculties() { return $this->belongsToMany(Faculty::class, 'workers_faculties')->withPivot(['position']); diff --git a/app/Observers/CategoryObserver.php b/app/Observers/CategoryObserver.php new file mode 100644 index 0000000..97e68e1 --- /dev/null +++ b/app/Observers/CategoryObserver.php @@ -0,0 +1,56 @@ +categoryCacheService = new CategoryCacheService(); + } + + /** + * Handle the Post "created" event. + */ + public function saved(Category $category): void + { + $this->categoryCacheService->clearAllCacheByModel(); + } + + /** + * Handle the Post "updated" event. + */ + public function updated(Category $category) + { + $this->categoryCacheService->clearAllCacheByModel(); + } + + /** + * Очистка кеша при удалении поста. + */ + public function deleted(Category $category) + { + $this->categoryCacheService->clearAllCacheByModel(); + } + + /** + * Handle the Post "restored" event. + */ + public function restored(Category $category): void + { + // + } + + /** + * Handle the Post "force deleted" event. + */ + public function forceDeleted(Category $category): void + { + // + } +} diff --git a/app/Observers/PageObserver.php b/app/Observers/PageObserver.php index ea098d8..c074945 100644 --- a/app/Observers/PageObserver.php +++ b/app/Observers/PageObserver.php @@ -3,16 +3,24 @@ namespace App\Observers; use App\Models\Page; +use App\Services\App\Cache\PageCacheService; use Illuminate\Support\Facades\Cache; class PageObserver { + private PageCacheService $pageCacheService; + + public function __construct() + { + $this->pageCacheService = app(PageCacheService::class); + } + /** * Handle the Page "created" event. */ public function created(Page $page): void { - Cache::forget('navigation'); + $this->pageCacheService->clearAllCacheByModel(); } /** @@ -20,9 +28,7 @@ class PageObserver */ public function updated(Page $page) { - $cacheKey = 'page_' . md5($page->path); - Cache::forget($cacheKey); - Cache::forget('navigation'); + $this->pageCacheService->clearCache($page); } /** @@ -30,9 +36,7 @@ class PageObserver */ public function deleted(Page $page) { - $cacheKey = 'page_' . md5($page->path); - Cache::forget($cacheKey); - Cache::forget('navigation'); + $this->pageCacheService->clearAllCacheByModel(); } /** diff --git a/app/Observers/PostObserver.php b/app/Observers/PostObserver.php index 8dd0be3..1d6cfcc 100644 --- a/app/Observers/PostObserver.php +++ b/app/Observers/PostObserver.php @@ -3,18 +3,26 @@ namespace App\Observers; use App\Models\Post; +use App\Services\App\Cache\PostCacheService; use Filament\Notifications\Notification; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Redirect; class PostObserver { + protected PostCacheService $postCacheService; + + public function __construct() + { + $this->postCacheService = new PostCacheService(); + } + /** * Handle the Post "created" event. */ public function saved(Post $post): void { - + $this->postCacheService->clearAllCacheByModel(); } /** @@ -22,8 +30,7 @@ class PostObserver */ public function updated(Post $post) { - $this->clearPostCache($post); - $this->cachePost($post); // Кешируем обновленный пост + $this->postCacheService->clearCache($post); } /** @@ -31,7 +38,7 @@ class PostObserver */ public function deleted(Post $post) { - $this->clearPostCache($post); + $this->postCacheService->clearAllCacheByModel(); } /** @@ -50,23 +57,4 @@ class PostObserver // } - protected function cachePost(Post $post) - { - $cacheKey = 'post_' . md5($post->slug); - $cacheData = [ - 'post' => $post, - 'seo' => $post->seo, - ]; - - Cache::put($cacheKey, $cacheData, now()->addHours(1)); // Кешируем на 1 час - } - - /** - * Очистка кеша поста. - */ - protected function clearPostCache(Post $post) - { - $cacheKey = 'post_' . md5($post->slug); - Cache::forget($cacheKey); - } } diff --git a/app/Observers/TagObserver.php b/app/Observers/TagObserver.php new file mode 100644 index 0000000..9ff4ce8 --- /dev/null +++ b/app/Observers/TagObserver.php @@ -0,0 +1,56 @@ +tagCacheService = new TagCacheService(); + } + + /** + * Handle the Post "created" event. + */ + public function saved(Tag $tag): void + { + $this->tagCacheService->clearAllCacheByModel(); + } + + /** + * Handle the Post "updated" event. + */ + public function updated(Tag $tag) + { + $this->tagCacheService->clearAllCacheByModel(); + } + + /** + * Очистка кеша при удалении поста. + */ + public function deleted(Tag $tag) + { + $this->tagCacheService->clearAllCacheByModel(); + } + + /** + * Handle the Post "restored" event. + */ + public function restored(Tag $tag): void + { + // + } + + /** + * Handle the Post "force deleted" event. + */ + public function forceDeleted(Tag $tag): void + { + // + } +} diff --git a/app/Services/App/Cache/AbstractCacheService.php b/app/Services/App/Cache/AbstractCacheService.php new file mode 100644 index 0000000..f67adee --- /dev/null +++ b/app/Services/App/Cache/AbstractCacheService.php @@ -0,0 +1,27 @@ +clearCacheByPrefix('categories*'); + $this->clearCacheByPrefix('category_content_*'); + } + + + /** + * Получает кешированные данные по ключу. + * + * @param string $key Ключ кеша + * @return mixed + */ + public function getCachedData(string $key) + { + return Cache::get($key); + } + + /** + * Кеширует данные по ключу. + * + * @param string $key Ключ кеша + * @param mixed $data Данные для кеширования + * @param int $ttl Время жизни кеша в секундах + * @return void + */ + public function cacheData(string $key, $data, int $ttl = 3600): void + { + Cache::put($key, $data, $ttl); + } +} \ No newline at end of file diff --git a/app/Services/App/Cache/MainSectionCacheService.php b/app/Services/App/Cache/MainSectionCacheService.php new file mode 100644 index 0000000..e48fe8f --- /dev/null +++ b/app/Services/App/Cache/MainSectionCacheService.php @@ -0,0 +1,44 @@ +clearCacheByPrefix('posts_'); + } + + + /** + * Получает кешированные данные по ключу. + * + * @param string $key Ключ кеша + * @return mixed + */ + public function getCachedData(string $key) + { + return Cache::get($key); + } + + /** + * Кеширует данные по ключу. + * + * @param string $key Ключ кеша + * @param mixed $data Данные для кеширования + * @param int $ttl Время жизни кеша в секундах + * @return void + */ + public function cacheData(string $key, $data, int $ttl = 3600): void + { + Cache::put($key, $data, $ttl); + } +} \ No newline at end of file diff --git a/app/Services/App/Cache/PageCacheService.php b/app/Services/App/Cache/PageCacheService.php new file mode 100644 index 0000000..d916b9d --- /dev/null +++ b/app/Services/App/Cache/PageCacheService.php @@ -0,0 +1,63 @@ +path); + $cacheKeyById = md5($entity->id); + + + + Cache::forget('page_' . $cacheKeyByPath); + Cache::forget('page_' . $cacheKeyById); + + Cache::forget('navigation'); + + } + + public function clearAllCacheByModel(): void + { + $this->clearCacheByPrefix('page_*'); + $this->clearCacheByPrefix('page_data_*'); + Cache::forget('navigation'); + + } + + + /** + * Получает кешированные данные по ключу. + * + * @param string $key Ключ кеша + * @return mixed + */ + public function getCachedData(string $key) + { + return Cache::get($key); + } + + /** + * Кеширует данные по ключу. + * + * @param string $key Ключ кеша + * @param mixed $data Данные для кеширования + * @param int $ttl Время жизни кеша в секундах + * @return void + */ + public function cacheData(string $key, $data, int $ttl = 3600): void + { + Cache::put($key, $data, $ttl); + } +} \ No newline at end of file diff --git a/app/Services/App/Cache/PostCacheService.php b/app/Services/App/Cache/PostCacheService.php new file mode 100644 index 0000000..c345950 --- /dev/null +++ b/app/Services/App/Cache/PostCacheService.php @@ -0,0 +1,56 @@ +slug); + $cacheKeyById = md5($entity->id); + + Cache::forget($cacheKeyBySlug); + Cache::forget($cacheKeyById); + } + + public function clearAllCacheByModel(): void + { + $this->clearCacheByPrefix('post_*'); + $this->clearCacheByPrefix('posts_*'); + } + + /** + * Получает кешированные данные по ключу. + * + * @param string $key Ключ кеша + * @return mixed + */ + public function getCachedData(string $key) + { + return Cache::get($key); + } + + /** + * Кеширует данные по ключу. + * + * @param string $key Ключ кеша + * @param mixed $data Данные для кеширования + * @param int $ttl Время жизни кеша в секундах + * @return void + */ + public function cacheData(string $key, $data, int $ttl = 3600): void + { + Cache::put($key, $data, $ttl); + } + + +} \ No newline at end of file diff --git a/app/Services/App/Cache/SubSectionCacheService.php b/app/Services/App/Cache/SubSectionCacheService.php new file mode 100644 index 0000000..9262e01 --- /dev/null +++ b/app/Services/App/Cache/SubSectionCacheService.php @@ -0,0 +1,43 @@ +clearCacheByPrefix('posts_'); + } + + /** + * Получает кешированные данные по ключу. + * + * @param string $key Ключ кеша + * @return mixed + */ + public function getCachedData(string $key) + { + return Cache::get($key); + } + + /** + * Кеширует данные по ключу. + * + * @param string $key Ключ кеша + * @param mixed $data Данные для кеширования + * @param int $ttl Время жизни кеша в секундах + * @return void + */ + public function cacheData(string $key, $data, int $ttl = 3600): void + { + Cache::put($key, $data, $ttl); + } +} \ No newline at end of file diff --git a/app/Services/App/Cache/TagCacheService.php b/app/Services/App/Cache/TagCacheService.php new file mode 100644 index 0000000..4cdc694 --- /dev/null +++ b/app/Services/App/Cache/TagCacheService.php @@ -0,0 +1,50 @@ +clearCacheByPrefix('tag_ids*'); + $this->clearCacheByPrefix('tags*'); + $this->clearCacheByPrefix('tag_content_*'); + } + + + /** + * Получает кешированные данные по ключу. + * + * @param string $key Ключ кеша + * @return mixed + */ + public function getCachedData(string $key) + { + return Cache::get($key); + } + + /** + * Кеширует данные по ключу. + * + * @param string $key Ключ кеша + * @param mixed $data Данные для кеширования + * @param int $ttl Время жизни кеша в секундах + * @return void + */ + public function cacheData(string $key, $data, int $ttl = 3600): void + { + Cache::put($key, $data, $ttl); + } +} \ No newline at end of file diff --git a/config/database.php b/config/database.php index 30d6606..fe13955 100644 --- a/config/database.php +++ b/config/database.php @@ -134,7 +134,7 @@ return [ 'username' => env('REDIS_USERNAME'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_DB', '0'), + 'database' => env('REDIS_DB', '1'), ], 'cache' => [ diff --git a/resources/js/Components/BuilderUi/Pages/Blocks/PostListBlock.vue b/resources/js/Components/BuilderUi/Pages/Blocks/PostListBlock.vue index 86086e0..e737b48 100644 --- a/resources/js/Components/BuilderUi/Pages/Blocks/PostListBlock.vue +++ b/resources/js/Components/BuilderUi/Pages/Blocks/PostListBlock.vue @@ -9,7 +9,6 @@
-

+
+ Опубликовано {{ post.created_post }} +

{{ post.title }}

- Produce professional, reliable streams easily leveraging Preline's innovative broadcast studio + {{ textLimit(post.preview_text, 80) }}

Читать далее @@ -129,7 +131,15 @@ export default { console.error('Ошибка:', error); this.loading = false; // Установить состояние загрузки в false даже при ошибке }); - } + }, + textLimit(text, symbols) { + if (text.length > symbols) { + let LimitedText; + LimitedText = text.substring(0, symbols); + return LimitedText + "..."; + } + return text; + }, }, mounted() { this.getPosts(); diff --git a/routes/api.php b/routes/api.php index 3a49e0e..cc277ee 100644 --- a/routes/api.php +++ b/routes/api.php @@ -16,44 +16,51 @@ use App\Models\AdmissionCampaign; use App\Services\Vicon\DirectionStudy\DirectionStudyService; use App\Services\VK\VkAuthService; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; -Route::get('/getNavigation', [NavigateController::class, 'index'])->name('client.main.navigate'); - Route::get('/getAcademicYear', function () { $activeCampaign = AdmissionCampaign::query()->where('status', 1)->first(); return $activeCampaign->academic_year; })->name('academic.year'); -Route::get('/search', [SearchController::class, 'index'])->name('client.search.index'); +Route::middleware('ensure.browser')->group(function () { + Route::get('/getNavigation', [NavigateController::class, 'index'])->name('client.main.navigate'); -Route::get('/widget/get-posts', [ClientWidgetPostController::class, 'index'])->name('client.widget.post.index'); + Route::get('/search', [SearchController::class, 'index'])->name('client.search.index'); -Route::get('/widget/get-posts/{id}', [ClientWidgetPostController::class, 'single'])->name('client.widget.post.single'); + Route::get('/widget/get-posts', [ClientWidgetPostController::class, 'index'])->name('client.widget.post.index'); -Route::get('/widget/get-additional-programs', [ClientWidgetAdditionalEducationalProgramController::class, 'index'])->name('client.widget.additional.program.index'); + Route::get('/widget/get-posts/{id}', [ClientWidgetPostController::class, 'single'])->name('client.widget.post.single'); -Route::get('/widget/get-educational-programs', [ClientWidgetEducationalProgramController::class, 'index'])->name('client.widget.educational.program.index'); + Route::get('/widget/get-additional-programs', [ClientWidgetAdditionalEducationalProgramController::class, 'index'])->name('client.widget.additional.program.index'); + + Route::get('/widget/get-educational-programs', [ClientWidgetEducationalProgramController::class, 'index'])->name('client.widget.educational.program.index'); + + Route::get('/widget/get-page-resource/{id}', [ClientWidgetPageReferenceListController::class, 'show'])->name('client.widget.page.resource.show'); + + Route::get('/widget/get-contact-widget/{id}', [ClientWidgetContactController::class, 'show'])->name('client.widget.contact.show'); + + Route::get('/widget/get-page/{path}', [ClientWidgetPageController::class, 'single'])->name('client.widget.page.single'); + + Route::get('/widget/get-form/{id}', [ClientWidgetFormController::class, 'single'])->middleware('rate.limited.check')->name('client.widget.form.single'); + + Route::post('/widget/get-form/{id}/submit', [ClientWidgetFormController::class, 'submit'])->middleware(['rate.limited.counter', 'rate.limited.check'])->name('client.widget.form.submit'); +}); + +Route::middleware(['auth', 'superadmin'])->group(function () { + Route::get('/login/vk', [VkAuthService::class, 'redirectToProvider'])->name('vk.login'); + Route::get('/login/vk/callback', [VkAuthService::class, 'handleProviderCallback'])->name('vk.callback'); + Route::get('/vk-get-token', [VkAuthService::class, 'getToken'])->name('vk.getToken'); + Route::get('/vk-refresh-token', [VkAuthService::class, 'refresh'])->name('vk.refreshToken'); + Route::get('/vk-logout', [VkAuthService::class, 'logout'])->name('vk.logout'); +}); -Route::get('/widget/get-page-resource/{id}', [ClientWidgetPageReferenceListController::class, 'show'])->name('client.widget.page.resource.show'); - -Route::get('/widget/get-contact-widget/{id}', [ClientWidgetContactController::class, 'show'])->name('client.widget.contact.show'); -Route::get('/widget/get-page/{id}', [ClientWidgetPageController::class, 'single'])->name('client.widget.page.single'); -Route::get('/widget/get-form/{id}', [ClientWidgetFormController::class, 'single'])->middleware('rate.limited.check')->name('client.widget.form.single'); - -Route::post('/widget/get-form/{id}/submit', [ClientWidgetFormController::class, 'submit'])->middleware(['rate.limited.counter', 'rate.limited.check'])->name('client.widget.form.submit'); - - -Route::get('/login/vk', [VkAuthService::class, 'redirectToProvider'])->name('vk.login'); -Route::get('/login/vk/callback', [VkAuthService::class, 'handleProviderCallback'])->name('vk.callback'); -Route::get('/vk-get-token', [VkAuthService::class, 'getToken'])->name('vk.getToken'); -Route::get('/vk-refresh-token', [VkAuthService::class, 'refresh'])->name('vk.refreshToken'); -Route::get('/vk-logout', [VkAuthService::class, 'logout'])->name('vk.logout');