├── README.md ├── backend ├── courses │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-312.pyc │ │ ├── admin.cpython-312.pyc │ │ ├── apps.cpython-312.pyc │ │ ├── filters.cpython-312.pyc │ │ ├── models.cpython-312.pyc │ │ ├── serializers.cpython-312.pyc │ │ └── views.cpython-312.pyc │ ├── admin.py │ ├── apps.py │ ├── filters.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── __init__.py │ │ └── __pycache__ │ │ │ ├── 0001_initial.cpython-312.pyc │ │ │ └── __init__.cpython-312.pyc │ ├── models.py │ ├── serializers.py │ ├── tests.py │ └── views.py ├── db.sqlite3 ├── manage.py ├── media │ └── courses │ │ ├── AI.jpg │ │ ├── AI_hs9l7SH.jpg │ │ ├── django.jpeg │ │ ├── mobile.jpg │ │ └── python.jpg └── project │ ├── __init__.py │ ├── __pycache__ │ ├── __init__.cpython-312.pyc │ ├── settings.cpython-312.pyc │ ├── urls.cpython-312.pyc │ └── wsgi.cpython-312.pyc │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── frontend ├── .gitignore ├── .vscode │ └── extensions.json ├── README.md ├── index.html ├── jsconfig.json ├── package-lock.json ├── package.json ├── public │ └── favicon.ico ├── src │ ├── App.vue │ ├── assets │ │ ├── AI.jpg │ │ ├── django.jpeg │ │ ├── mobile.jpg │ │ └── python.jpg │ ├── components │ │ ├── CourseFilter.vue │ │ ├── CourseList.vue │ │ ├── Navbar.vue │ │ └── icons │ │ │ ├── IconCommunity.vue │ │ │ ├── IconDocumentation.vue │ │ │ ├── IconEcosystem.vue │ │ │ ├── IconSupport.vue │ │ │ ├── IconTooling.vue │ │ │ └── Navbar.vue │ ├── main.js │ ├── router │ │ └── index.js │ ├── temp-data.js │ └── views │ │ ├── CourseDetailView.vue │ │ └── CoursesView.vue └── vite.config.js └── requirements.txt /README.md: -------------------------------------------------------------------------------- 1 | # Django & Vuejs Courses Filter 2 | ![2024-02-06](https://github.com/AbdullahBakir97/Vue-Store/assets/127149804/c99c62c2-68fc-4c1e-b901-d18ff31f4f1c) 3 | -------------------------------------------------------------------------------- /backend/courses/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/__init__.py -------------------------------------------------------------------------------- /backend/courses/__pycache__/__init__.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/__pycache__/__init__.cpython-312.pyc -------------------------------------------------------------------------------- /backend/courses/__pycache__/admin.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/__pycache__/admin.cpython-312.pyc -------------------------------------------------------------------------------- /backend/courses/__pycache__/apps.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/__pycache__/apps.cpython-312.pyc -------------------------------------------------------------------------------- /backend/courses/__pycache__/filters.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/__pycache__/filters.cpython-312.pyc -------------------------------------------------------------------------------- /backend/courses/__pycache__/models.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/__pycache__/models.cpython-312.pyc -------------------------------------------------------------------------------- /backend/courses/__pycache__/serializers.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/__pycache__/serializers.cpython-312.pyc -------------------------------------------------------------------------------- /backend/courses/__pycache__/views.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/__pycache__/views.cpython-312.pyc -------------------------------------------------------------------------------- /backend/courses/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Course , Category 4 | 5 | 6 | admin.site.register(Course) 7 | admin.site.register(Category) 8 | -------------------------------------------------------------------------------- /backend/courses/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CoursesConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'courses' 7 | -------------------------------------------------------------------------------- /backend/courses/filters.py: -------------------------------------------------------------------------------- 1 | from django_filters import rest_framework as filters 2 | 3 | 4 | class CourseFilter(filters.FilterSet): 5 | category = filters.CharFilter(field_name='Category', method='filter_by_category') 6 | 7 | def filter_by_category(self, queryset, name, value): 8 | ids = value.split(',') 9 | return queryset.filter(category__id__in=ids) 10 | -------------------------------------------------------------------------------- /backend/courses/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.0.2 on 2024-02-07 22:10 2 | 3 | import django.db.models.deletion 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Category', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('name', models.CharField(max_length=100)), 20 | ], 21 | ), 22 | migrations.CreateModel( 23 | name='Course', 24 | fields=[ 25 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 26 | ('name', models.CharField(max_length=100)), 27 | ('subtitle', models.CharField(max_length=300)), 28 | ('description', models.TextField(max_length=5000)), 29 | ('image', models.ImageField(upload_to='courses/')), 30 | ('price', models.FloatField()), 31 | ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='courses_category', to='courses.category')), 32 | ], 33 | ), 34 | ] 35 | -------------------------------------------------------------------------------- /backend/courses/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/migrations/__init__.py -------------------------------------------------------------------------------- /backend/courses/migrations/__pycache__/0001_initial.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/migrations/__pycache__/0001_initial.cpython-312.pyc -------------------------------------------------------------------------------- /backend/courses/migrations/__pycache__/__init__.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/courses/migrations/__pycache__/__init__.cpython-312.pyc -------------------------------------------------------------------------------- /backend/courses/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | 5 | class Category(models.Model): 6 | name = models.CharField(max_length=100) 7 | 8 | 9 | def __str__(self): 10 | return self.name 11 | 12 | class Course(models.Model): 13 | name = models.CharField(max_length=100) 14 | subtitle = models.CharField(max_length=300) 15 | description = models.TextField(max_length=5000) 16 | image = models.ImageField(upload_to='courses/') 17 | price = models.FloatField() 18 | category = models.ForeignKey(Category, related_name='courses_category', on_delete=models.CASCADE) 19 | 20 | def __str__(self): 21 | return self.name -------------------------------------------------------------------------------- /backend/courses/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import Category , Course 3 | 4 | 5 | class CourseSerializer(serializers.ModelSerializer): 6 | category = serializers.StringRelatedField() 7 | class Meta: 8 | model = Course 9 | fields = '__all__' 10 | 11 | 12 | 13 | class CategorySerializer(serializers.ModelSerializer): 14 | class Meta: 15 | model = Category 16 | fields = '__all__' -------------------------------------------------------------------------------- /backend/courses/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /backend/courses/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import generics 2 | from rest_framework import filters 3 | from django_filters.rest_framework import DjangoFilterBackend 4 | 5 | from.models import Category, Course 6 | from .serializers import CategorySerializer, CourseSerializer 7 | from .filters import CourseFilter 8 | 9 | class CategoryListAPI(generics.ListAPIView): 10 | queryset = Category.objects.all() 11 | serializer_class = CategorySerializer 12 | 13 | 14 | class CourseListAPI(generics.ListAPIView): 15 | queryset = Course.objects.all() 16 | serializer_class = CourseSerializer 17 | filter_backends = (DjangoFilterBackend,) 18 | filterset_fields = ('category',) 19 | filterset_class = CourseFilter 20 | 21 | class CourseDetailAPI(generics.RetrieveAPIView): 22 | queryset = Course.objects.all() 23 | serializer_class = CourseSerializer 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /backend/db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/db.sqlite3 -------------------------------------------------------------------------------- /backend/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /backend/media/courses/AI.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/media/courses/AI.jpg -------------------------------------------------------------------------------- /backend/media/courses/AI_hs9l7SH.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/media/courses/AI_hs9l7SH.jpg -------------------------------------------------------------------------------- /backend/media/courses/django.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/media/courses/django.jpeg -------------------------------------------------------------------------------- /backend/media/courses/mobile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/media/courses/mobile.jpg -------------------------------------------------------------------------------- /backend/media/courses/python.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/media/courses/python.jpg -------------------------------------------------------------------------------- /backend/project/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/project/__init__.py -------------------------------------------------------------------------------- /backend/project/__pycache__/__init__.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/project/__pycache__/__init__.cpython-312.pyc -------------------------------------------------------------------------------- /backend/project/__pycache__/settings.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/project/__pycache__/settings.cpython-312.pyc -------------------------------------------------------------------------------- /backend/project/__pycache__/urls.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/project/__pycache__/urls.cpython-312.pyc -------------------------------------------------------------------------------- /backend/project/__pycache__/wsgi.cpython-312.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/backend/project/__pycache__/wsgi.cpython-312.pyc -------------------------------------------------------------------------------- /backend/project/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for project project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /backend/project/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for project project. 3 | 4 | Generated by 'django-admin startproject' using Django 5.0.2. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/5.0/ref/settings/ 11 | """ 12 | 13 | from pathlib import Path 14 | 15 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 16 | BASE_DIR = Path(__file__).resolve().parent.parent 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'django-insecure-#zmeddm$_#&53@gxvplsh=&rl)x_2fdollxfe)z4kie#ih5%9w' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'django.contrib.admin', 35 | 'django.contrib.auth', 36 | 'django.contrib.contenttypes', 37 | 'django.contrib.sessions', 38 | 'django.contrib.messages', 39 | 'django.contrib.staticfiles', 40 | 41 | 42 | 'rest_framework', 43 | 'django_filters', 44 | 'drf_yasg', 45 | "corsheaders", 46 | 'PIL', 47 | 48 | 'courses', 49 | 50 | ] 51 | 52 | CORS_ORIGIN_ALLOW_ALL = True 53 | CORS_ALLOW_ALL_ORIGINS = True 54 | 55 | MIDDLEWARE = [ 56 | 'django.middleware.security.SecurityMiddleware', 57 | 'django.contrib.sessions.middleware.SessionMiddleware', 58 | "corsheaders.middleware.CorsMiddleware", 59 | 'django.middleware.common.CommonMiddleware', 60 | 'django.middleware.csrf.CsrfViewMiddleware', 61 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 62 | 'django.contrib.messages.middleware.MessageMiddleware', 63 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 64 | ] 65 | 66 | ROOT_URLCONF = 'project.urls' 67 | 68 | TEMPLATES = [ 69 | { 70 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 71 | 'DIRS': [], 72 | 'APP_DIRS': True, 73 | 'OPTIONS': { 74 | 'context_processors': [ 75 | 'django.template.context_processors.debug', 76 | 'django.template.context_processors.request', 77 | 'django.contrib.auth.context_processors.auth', 78 | 'django.contrib.messages.context_processors.messages', 79 | ], 80 | }, 81 | }, 82 | ] 83 | 84 | WSGI_APPLICATION = 'project.wsgi.application' 85 | 86 | 87 | # Database 88 | # https://docs.djangoproject.com/en/5.0/ref/settings/#databases 89 | 90 | DATABASES = { 91 | 'default': { 92 | 'ENGINE': 'django.db.backends.sqlite3', 93 | 'NAME': BASE_DIR / 'db.sqlite3', 94 | } 95 | } 96 | 97 | 98 | # Password validation 99 | # https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators 100 | 101 | AUTH_PASSWORD_VALIDATORS = [ 102 | { 103 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 104 | }, 105 | { 106 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 107 | }, 108 | { 109 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 110 | }, 111 | { 112 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 113 | }, 114 | ] 115 | 116 | 117 | # Internationalization 118 | # https://docs.djangoproject.com/en/5.0/topics/i18n/ 119 | 120 | LANGUAGE_CODE = 'en-us' 121 | 122 | TIME_ZONE = 'UTC' 123 | 124 | USE_I18N = True 125 | 126 | USE_TZ = True 127 | 128 | 129 | # Static files (CSS, JavaScript, Images) 130 | # https://docs.djangoproject.com/en/5.0/howto/static-files/ 131 | 132 | STATIC_URL = 'static/' 133 | STATICFILES_DIRS = [ 134 | BASE_DIR / "static", 135 | ] 136 | 137 | MEDIA_URL = '/media/' 138 | MEDIA_ROOT = BASE_DIR / "media" 139 | 140 | # Default primary key field type 141 | # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field 142 | 143 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 144 | -------------------------------------------------------------------------------- /backend/project/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URL configuration for project project. 3 | 4 | The `urlpatterns` list routes URLs to views. For more information please see: 5 | https://docs.djangoproject.com/en/5.0/topics/http/urls/ 6 | Examples: 7 | Function views 8 | 1. Add an import: from my_app import views 9 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 10 | Class-based views 11 | 1. Add an import: from other_app.views import Home 12 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 13 | Including another URLconf 14 | 1. Import the include() function: from django.urls import include, path 15 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 16 | """ 17 | from django.contrib import admin 18 | from django.urls import path 19 | from django.conf import settings 20 | from django.conf.urls.static import static 21 | 22 | from courses.views import CourseListAPI, CourseDetailAPI, CategoryListAPI 23 | 24 | from django.urls import re_path 25 | from rest_framework import permissions 26 | from drf_yasg.views import get_schema_view 27 | from drf_yasg import openapi 28 | 29 | 30 | 31 | schema_view = get_schema_view( 32 | openapi.Info( 33 | title="Courses API", 34 | default_version='v1', 35 | description="Test description", 36 | terms_of_service="https://www.google.com/policies/terms/", 37 | contact=openapi.Contact(email="contact@snippets.local"), 38 | license=openapi.License(name="BSD License"), 39 | ), 40 | public=True, 41 | permission_classes=(permissions.AllowAny,), 42 | ) 43 | 44 | urlpatterns = [ 45 | path('admin/', admin.site.urls), 46 | path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), 47 | 48 | path('api/courses/', CourseListAPI.as_view()), 49 | path('api/courses//', CourseDetailAPI.as_view()), 50 | path('api/category/', CategoryListAPI.as_view()), 51 | ] 52 | 53 | 54 | urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 55 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -------------------------------------------------------------------------------- /backend/project/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for project project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | 30 | *.tsbuildinfo 31 | -------------------------------------------------------------------------------- /frontend/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Vue Store 2 | 3 | Udemy Courses Filter Clone Using VueJs 4 | ![2024-02-06](https://github.com/AbdullahBakir97/Vue-Store/assets/127149804/c99c62c2-68fc-4c1e-b901-d18ff31f4f1c) 5 | 6 | ## Recommended IDE Setup 7 | 8 | [VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). 9 | 10 | ## Customize configuration 11 | 12 | See [Vite Configuration Reference](https://vitejs.dev/config/). 13 | 14 | ## Project Setup 15 | 16 | ```sh 17 | npm install 18 | ``` 19 | 20 | ### Compile and Hot-Reload for Development 21 | 22 | ```sh 23 | npm run dev 24 | ``` 25 | 26 | ### Compile and Minify for Production 27 | 28 | ```sh 29 | npm run build 30 | ``` 31 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /frontend/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./src/*"] 5 | } 6 | }, 7 | "exclude": ["node_modules", "dist"] 8 | } 9 | -------------------------------------------------------------------------------- /frontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-store", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "vue-store", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "axios": "^1.6.7", 12 | "bootstrap": "^5.3.2", 13 | "bootstrap-icons": "^1.11.3", 14 | "primeflex": "^3.3.1", 15 | "primeicons": "^6.0.1", 16 | "primevue": "^3.48.1", 17 | "vue": "^3.4.15", 18 | "vue-router": "^4.2.5" 19 | }, 20 | "devDependencies": { 21 | "@vitejs/plugin-vue": "^5.0.3", 22 | "vite": "^5.0.11" 23 | } 24 | }, 25 | "node_modules/@babel/parser": { 26 | "version": "7.23.9", 27 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", 28 | "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", 29 | "bin": { 30 | "parser": "bin/babel-parser.js" 31 | }, 32 | "engines": { 33 | "node": ">=6.0.0" 34 | } 35 | }, 36 | "node_modules/@esbuild/aix-ppc64": { 37 | "version": "0.19.12", 38 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", 39 | "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", 40 | "cpu": [ 41 | "ppc64" 42 | ], 43 | "dev": true, 44 | "optional": true, 45 | "os": [ 46 | "aix" 47 | ], 48 | "engines": { 49 | "node": ">=12" 50 | } 51 | }, 52 | "node_modules/@esbuild/android-arm": { 53 | "version": "0.19.12", 54 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", 55 | "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", 56 | "cpu": [ 57 | "arm" 58 | ], 59 | "dev": true, 60 | "optional": true, 61 | "os": [ 62 | "android" 63 | ], 64 | "engines": { 65 | "node": ">=12" 66 | } 67 | }, 68 | "node_modules/@esbuild/android-arm64": { 69 | "version": "0.19.12", 70 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", 71 | "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", 72 | "cpu": [ 73 | "arm64" 74 | ], 75 | "dev": true, 76 | "optional": true, 77 | "os": [ 78 | "android" 79 | ], 80 | "engines": { 81 | "node": ">=12" 82 | } 83 | }, 84 | "node_modules/@esbuild/android-x64": { 85 | "version": "0.19.12", 86 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", 87 | "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", 88 | "cpu": [ 89 | "x64" 90 | ], 91 | "dev": true, 92 | "optional": true, 93 | "os": [ 94 | "android" 95 | ], 96 | "engines": { 97 | "node": ">=12" 98 | } 99 | }, 100 | "node_modules/@esbuild/darwin-arm64": { 101 | "version": "0.19.12", 102 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", 103 | "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", 104 | "cpu": [ 105 | "arm64" 106 | ], 107 | "dev": true, 108 | "optional": true, 109 | "os": [ 110 | "darwin" 111 | ], 112 | "engines": { 113 | "node": ">=12" 114 | } 115 | }, 116 | "node_modules/@esbuild/darwin-x64": { 117 | "version": "0.19.12", 118 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", 119 | "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", 120 | "cpu": [ 121 | "x64" 122 | ], 123 | "dev": true, 124 | "optional": true, 125 | "os": [ 126 | "darwin" 127 | ], 128 | "engines": { 129 | "node": ">=12" 130 | } 131 | }, 132 | "node_modules/@esbuild/freebsd-arm64": { 133 | "version": "0.19.12", 134 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", 135 | "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", 136 | "cpu": [ 137 | "arm64" 138 | ], 139 | "dev": true, 140 | "optional": true, 141 | "os": [ 142 | "freebsd" 143 | ], 144 | "engines": { 145 | "node": ">=12" 146 | } 147 | }, 148 | "node_modules/@esbuild/freebsd-x64": { 149 | "version": "0.19.12", 150 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", 151 | "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", 152 | "cpu": [ 153 | "x64" 154 | ], 155 | "dev": true, 156 | "optional": true, 157 | "os": [ 158 | "freebsd" 159 | ], 160 | "engines": { 161 | "node": ">=12" 162 | } 163 | }, 164 | "node_modules/@esbuild/linux-arm": { 165 | "version": "0.19.12", 166 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", 167 | "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", 168 | "cpu": [ 169 | "arm" 170 | ], 171 | "dev": true, 172 | "optional": true, 173 | "os": [ 174 | "linux" 175 | ], 176 | "engines": { 177 | "node": ">=12" 178 | } 179 | }, 180 | "node_modules/@esbuild/linux-arm64": { 181 | "version": "0.19.12", 182 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", 183 | "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", 184 | "cpu": [ 185 | "arm64" 186 | ], 187 | "dev": true, 188 | "optional": true, 189 | "os": [ 190 | "linux" 191 | ], 192 | "engines": { 193 | "node": ">=12" 194 | } 195 | }, 196 | "node_modules/@esbuild/linux-ia32": { 197 | "version": "0.19.12", 198 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", 199 | "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", 200 | "cpu": [ 201 | "ia32" 202 | ], 203 | "dev": true, 204 | "optional": true, 205 | "os": [ 206 | "linux" 207 | ], 208 | "engines": { 209 | "node": ">=12" 210 | } 211 | }, 212 | "node_modules/@esbuild/linux-loong64": { 213 | "version": "0.19.12", 214 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", 215 | "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", 216 | "cpu": [ 217 | "loong64" 218 | ], 219 | "dev": true, 220 | "optional": true, 221 | "os": [ 222 | "linux" 223 | ], 224 | "engines": { 225 | "node": ">=12" 226 | } 227 | }, 228 | "node_modules/@esbuild/linux-mips64el": { 229 | "version": "0.19.12", 230 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", 231 | "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", 232 | "cpu": [ 233 | "mips64el" 234 | ], 235 | "dev": true, 236 | "optional": true, 237 | "os": [ 238 | "linux" 239 | ], 240 | "engines": { 241 | "node": ">=12" 242 | } 243 | }, 244 | "node_modules/@esbuild/linux-ppc64": { 245 | "version": "0.19.12", 246 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", 247 | "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", 248 | "cpu": [ 249 | "ppc64" 250 | ], 251 | "dev": true, 252 | "optional": true, 253 | "os": [ 254 | "linux" 255 | ], 256 | "engines": { 257 | "node": ">=12" 258 | } 259 | }, 260 | "node_modules/@esbuild/linux-riscv64": { 261 | "version": "0.19.12", 262 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", 263 | "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", 264 | "cpu": [ 265 | "riscv64" 266 | ], 267 | "dev": true, 268 | "optional": true, 269 | "os": [ 270 | "linux" 271 | ], 272 | "engines": { 273 | "node": ">=12" 274 | } 275 | }, 276 | "node_modules/@esbuild/linux-s390x": { 277 | "version": "0.19.12", 278 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", 279 | "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", 280 | "cpu": [ 281 | "s390x" 282 | ], 283 | "dev": true, 284 | "optional": true, 285 | "os": [ 286 | "linux" 287 | ], 288 | "engines": { 289 | "node": ">=12" 290 | } 291 | }, 292 | "node_modules/@esbuild/linux-x64": { 293 | "version": "0.19.12", 294 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", 295 | "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", 296 | "cpu": [ 297 | "x64" 298 | ], 299 | "dev": true, 300 | "optional": true, 301 | "os": [ 302 | "linux" 303 | ], 304 | "engines": { 305 | "node": ">=12" 306 | } 307 | }, 308 | "node_modules/@esbuild/netbsd-x64": { 309 | "version": "0.19.12", 310 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", 311 | "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", 312 | "cpu": [ 313 | "x64" 314 | ], 315 | "dev": true, 316 | "optional": true, 317 | "os": [ 318 | "netbsd" 319 | ], 320 | "engines": { 321 | "node": ">=12" 322 | } 323 | }, 324 | "node_modules/@esbuild/openbsd-x64": { 325 | "version": "0.19.12", 326 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", 327 | "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", 328 | "cpu": [ 329 | "x64" 330 | ], 331 | "dev": true, 332 | "optional": true, 333 | "os": [ 334 | "openbsd" 335 | ], 336 | "engines": { 337 | "node": ">=12" 338 | } 339 | }, 340 | "node_modules/@esbuild/sunos-x64": { 341 | "version": "0.19.12", 342 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", 343 | "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", 344 | "cpu": [ 345 | "x64" 346 | ], 347 | "dev": true, 348 | "optional": true, 349 | "os": [ 350 | "sunos" 351 | ], 352 | "engines": { 353 | "node": ">=12" 354 | } 355 | }, 356 | "node_modules/@esbuild/win32-arm64": { 357 | "version": "0.19.12", 358 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", 359 | "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", 360 | "cpu": [ 361 | "arm64" 362 | ], 363 | "dev": true, 364 | "optional": true, 365 | "os": [ 366 | "win32" 367 | ], 368 | "engines": { 369 | "node": ">=12" 370 | } 371 | }, 372 | "node_modules/@esbuild/win32-ia32": { 373 | "version": "0.19.12", 374 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", 375 | "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", 376 | "cpu": [ 377 | "ia32" 378 | ], 379 | "dev": true, 380 | "optional": true, 381 | "os": [ 382 | "win32" 383 | ], 384 | "engines": { 385 | "node": ">=12" 386 | } 387 | }, 388 | "node_modules/@esbuild/win32-x64": { 389 | "version": "0.19.12", 390 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", 391 | "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", 392 | "cpu": [ 393 | "x64" 394 | ], 395 | "dev": true, 396 | "optional": true, 397 | "os": [ 398 | "win32" 399 | ], 400 | "engines": { 401 | "node": ">=12" 402 | } 403 | }, 404 | "node_modules/@jridgewell/sourcemap-codec": { 405 | "version": "1.4.15", 406 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 407 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 408 | }, 409 | "node_modules/@popperjs/core": { 410 | "version": "2.11.8", 411 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", 412 | "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", 413 | "peer": true, 414 | "funding": { 415 | "type": "opencollective", 416 | "url": "https://opencollective.com/popperjs" 417 | } 418 | }, 419 | "node_modules/@rollup/rollup-android-arm-eabi": { 420 | "version": "4.9.6", 421 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz", 422 | "integrity": "sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==", 423 | "cpu": [ 424 | "arm" 425 | ], 426 | "dev": true, 427 | "optional": true, 428 | "os": [ 429 | "android" 430 | ] 431 | }, 432 | "node_modules/@rollup/rollup-android-arm64": { 433 | "version": "4.9.6", 434 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz", 435 | "integrity": "sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==", 436 | "cpu": [ 437 | "arm64" 438 | ], 439 | "dev": true, 440 | "optional": true, 441 | "os": [ 442 | "android" 443 | ] 444 | }, 445 | "node_modules/@rollup/rollup-darwin-arm64": { 446 | "version": "4.9.6", 447 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz", 448 | "integrity": "sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==", 449 | "cpu": [ 450 | "arm64" 451 | ], 452 | "dev": true, 453 | "optional": true, 454 | "os": [ 455 | "darwin" 456 | ] 457 | }, 458 | "node_modules/@rollup/rollup-darwin-x64": { 459 | "version": "4.9.6", 460 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz", 461 | "integrity": "sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==", 462 | "cpu": [ 463 | "x64" 464 | ], 465 | "dev": true, 466 | "optional": true, 467 | "os": [ 468 | "darwin" 469 | ] 470 | }, 471 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 472 | "version": "4.9.6", 473 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz", 474 | "integrity": "sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==", 475 | "cpu": [ 476 | "arm" 477 | ], 478 | "dev": true, 479 | "optional": true, 480 | "os": [ 481 | "linux" 482 | ] 483 | }, 484 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 485 | "version": "4.9.6", 486 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz", 487 | "integrity": "sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==", 488 | "cpu": [ 489 | "arm64" 490 | ], 491 | "dev": true, 492 | "optional": true, 493 | "os": [ 494 | "linux" 495 | ] 496 | }, 497 | "node_modules/@rollup/rollup-linux-arm64-musl": { 498 | "version": "4.9.6", 499 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz", 500 | "integrity": "sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==", 501 | "cpu": [ 502 | "arm64" 503 | ], 504 | "dev": true, 505 | "optional": true, 506 | "os": [ 507 | "linux" 508 | ] 509 | }, 510 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 511 | "version": "4.9.6", 512 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz", 513 | "integrity": "sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==", 514 | "cpu": [ 515 | "riscv64" 516 | ], 517 | "dev": true, 518 | "optional": true, 519 | "os": [ 520 | "linux" 521 | ] 522 | }, 523 | "node_modules/@rollup/rollup-linux-x64-gnu": { 524 | "version": "4.9.6", 525 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz", 526 | "integrity": "sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==", 527 | "cpu": [ 528 | "x64" 529 | ], 530 | "dev": true, 531 | "optional": true, 532 | "os": [ 533 | "linux" 534 | ] 535 | }, 536 | "node_modules/@rollup/rollup-linux-x64-musl": { 537 | "version": "4.9.6", 538 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz", 539 | "integrity": "sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==", 540 | "cpu": [ 541 | "x64" 542 | ], 543 | "dev": true, 544 | "optional": true, 545 | "os": [ 546 | "linux" 547 | ] 548 | }, 549 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 550 | "version": "4.9.6", 551 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz", 552 | "integrity": "sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==", 553 | "cpu": [ 554 | "arm64" 555 | ], 556 | "dev": true, 557 | "optional": true, 558 | "os": [ 559 | "win32" 560 | ] 561 | }, 562 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 563 | "version": "4.9.6", 564 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz", 565 | "integrity": "sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==", 566 | "cpu": [ 567 | "ia32" 568 | ], 569 | "dev": true, 570 | "optional": true, 571 | "os": [ 572 | "win32" 573 | ] 574 | }, 575 | "node_modules/@rollup/rollup-win32-x64-msvc": { 576 | "version": "4.9.6", 577 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz", 578 | "integrity": "sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==", 579 | "cpu": [ 580 | "x64" 581 | ], 582 | "dev": true, 583 | "optional": true, 584 | "os": [ 585 | "win32" 586 | ] 587 | }, 588 | "node_modules/@types/estree": { 589 | "version": "1.0.5", 590 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 591 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 592 | "dev": true 593 | }, 594 | "node_modules/@vitejs/plugin-vue": { 595 | "version": "5.0.3", 596 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz", 597 | "integrity": "sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==", 598 | "dev": true, 599 | "engines": { 600 | "node": "^18.0.0 || >=20.0.0" 601 | }, 602 | "peerDependencies": { 603 | "vite": "^5.0.0", 604 | "vue": "^3.2.25" 605 | } 606 | }, 607 | "node_modules/@vue/compiler-core": { 608 | "version": "3.4.15", 609 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.15.tgz", 610 | "integrity": "sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==", 611 | "dependencies": { 612 | "@babel/parser": "^7.23.6", 613 | "@vue/shared": "3.4.15", 614 | "entities": "^4.5.0", 615 | "estree-walker": "^2.0.2", 616 | "source-map-js": "^1.0.2" 617 | } 618 | }, 619 | "node_modules/@vue/compiler-dom": { 620 | "version": "3.4.15", 621 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.15.tgz", 622 | "integrity": "sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==", 623 | "dependencies": { 624 | "@vue/compiler-core": "3.4.15", 625 | "@vue/shared": "3.4.15" 626 | } 627 | }, 628 | "node_modules/@vue/compiler-sfc": { 629 | "version": "3.4.15", 630 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.15.tgz", 631 | "integrity": "sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==", 632 | "dependencies": { 633 | "@babel/parser": "^7.23.6", 634 | "@vue/compiler-core": "3.4.15", 635 | "@vue/compiler-dom": "3.4.15", 636 | "@vue/compiler-ssr": "3.4.15", 637 | "@vue/shared": "3.4.15", 638 | "estree-walker": "^2.0.2", 639 | "magic-string": "^0.30.5", 640 | "postcss": "^8.4.33", 641 | "source-map-js": "^1.0.2" 642 | } 643 | }, 644 | "node_modules/@vue/compiler-ssr": { 645 | "version": "3.4.15", 646 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.15.tgz", 647 | "integrity": "sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==", 648 | "dependencies": { 649 | "@vue/compiler-dom": "3.4.15", 650 | "@vue/shared": "3.4.15" 651 | } 652 | }, 653 | "node_modules/@vue/devtools-api": { 654 | "version": "6.5.1", 655 | "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", 656 | "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" 657 | }, 658 | "node_modules/@vue/reactivity": { 659 | "version": "3.4.15", 660 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.15.tgz", 661 | "integrity": "sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==", 662 | "dependencies": { 663 | "@vue/shared": "3.4.15" 664 | } 665 | }, 666 | "node_modules/@vue/runtime-core": { 667 | "version": "3.4.15", 668 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.15.tgz", 669 | "integrity": "sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==", 670 | "dependencies": { 671 | "@vue/reactivity": "3.4.15", 672 | "@vue/shared": "3.4.15" 673 | } 674 | }, 675 | "node_modules/@vue/runtime-dom": { 676 | "version": "3.4.15", 677 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.15.tgz", 678 | "integrity": "sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==", 679 | "dependencies": { 680 | "@vue/runtime-core": "3.4.15", 681 | "@vue/shared": "3.4.15", 682 | "csstype": "^3.1.3" 683 | } 684 | }, 685 | "node_modules/@vue/server-renderer": { 686 | "version": "3.4.15", 687 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.15.tgz", 688 | "integrity": "sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==", 689 | "dependencies": { 690 | "@vue/compiler-ssr": "3.4.15", 691 | "@vue/shared": "3.4.15" 692 | }, 693 | "peerDependencies": { 694 | "vue": "3.4.15" 695 | } 696 | }, 697 | "node_modules/@vue/shared": { 698 | "version": "3.4.15", 699 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.15.tgz", 700 | "integrity": "sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==" 701 | }, 702 | "node_modules/asynckit": { 703 | "version": "0.4.0", 704 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 705 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 706 | }, 707 | "node_modules/axios": { 708 | "version": "1.6.7", 709 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", 710 | "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", 711 | "dependencies": { 712 | "follow-redirects": "^1.15.4", 713 | "form-data": "^4.0.0", 714 | "proxy-from-env": "^1.1.0" 715 | } 716 | }, 717 | "node_modules/bootstrap": { 718 | "version": "5.3.2", 719 | "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", 720 | "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", 721 | "funding": [ 722 | { 723 | "type": "github", 724 | "url": "https://github.com/sponsors/twbs" 725 | }, 726 | { 727 | "type": "opencollective", 728 | "url": "https://opencollective.com/bootstrap" 729 | } 730 | ], 731 | "peerDependencies": { 732 | "@popperjs/core": "^2.11.8" 733 | } 734 | }, 735 | "node_modules/bootstrap-icons": { 736 | "version": "1.11.3", 737 | "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz", 738 | "integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==", 739 | "funding": [ 740 | { 741 | "type": "github", 742 | "url": "https://github.com/sponsors/twbs" 743 | }, 744 | { 745 | "type": "opencollective", 746 | "url": "https://opencollective.com/bootstrap" 747 | } 748 | ] 749 | }, 750 | "node_modules/combined-stream": { 751 | "version": "1.0.8", 752 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 753 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 754 | "dependencies": { 755 | "delayed-stream": "~1.0.0" 756 | }, 757 | "engines": { 758 | "node": ">= 0.8" 759 | } 760 | }, 761 | "node_modules/csstype": { 762 | "version": "3.1.3", 763 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 764 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" 765 | }, 766 | "node_modules/delayed-stream": { 767 | "version": "1.0.0", 768 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 769 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 770 | "engines": { 771 | "node": ">=0.4.0" 772 | } 773 | }, 774 | "node_modules/entities": { 775 | "version": "4.5.0", 776 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 777 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 778 | "engines": { 779 | "node": ">=0.12" 780 | }, 781 | "funding": { 782 | "url": "https://github.com/fb55/entities?sponsor=1" 783 | } 784 | }, 785 | "node_modules/esbuild": { 786 | "version": "0.19.12", 787 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", 788 | "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", 789 | "dev": true, 790 | "hasInstallScript": true, 791 | "bin": { 792 | "esbuild": "bin/esbuild" 793 | }, 794 | "engines": { 795 | "node": ">=12" 796 | }, 797 | "optionalDependencies": { 798 | "@esbuild/aix-ppc64": "0.19.12", 799 | "@esbuild/android-arm": "0.19.12", 800 | "@esbuild/android-arm64": "0.19.12", 801 | "@esbuild/android-x64": "0.19.12", 802 | "@esbuild/darwin-arm64": "0.19.12", 803 | "@esbuild/darwin-x64": "0.19.12", 804 | "@esbuild/freebsd-arm64": "0.19.12", 805 | "@esbuild/freebsd-x64": "0.19.12", 806 | "@esbuild/linux-arm": "0.19.12", 807 | "@esbuild/linux-arm64": "0.19.12", 808 | "@esbuild/linux-ia32": "0.19.12", 809 | "@esbuild/linux-loong64": "0.19.12", 810 | "@esbuild/linux-mips64el": "0.19.12", 811 | "@esbuild/linux-ppc64": "0.19.12", 812 | "@esbuild/linux-riscv64": "0.19.12", 813 | "@esbuild/linux-s390x": "0.19.12", 814 | "@esbuild/linux-x64": "0.19.12", 815 | "@esbuild/netbsd-x64": "0.19.12", 816 | "@esbuild/openbsd-x64": "0.19.12", 817 | "@esbuild/sunos-x64": "0.19.12", 818 | "@esbuild/win32-arm64": "0.19.12", 819 | "@esbuild/win32-ia32": "0.19.12", 820 | "@esbuild/win32-x64": "0.19.12" 821 | } 822 | }, 823 | "node_modules/estree-walker": { 824 | "version": "2.0.2", 825 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 826 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 827 | }, 828 | "node_modules/follow-redirects": { 829 | "version": "1.15.5", 830 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", 831 | "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", 832 | "funding": [ 833 | { 834 | "type": "individual", 835 | "url": "https://github.com/sponsors/RubenVerborgh" 836 | } 837 | ], 838 | "engines": { 839 | "node": ">=4.0" 840 | }, 841 | "peerDependenciesMeta": { 842 | "debug": { 843 | "optional": true 844 | } 845 | } 846 | }, 847 | "node_modules/form-data": { 848 | "version": "4.0.0", 849 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 850 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 851 | "dependencies": { 852 | "asynckit": "^0.4.0", 853 | "combined-stream": "^1.0.8", 854 | "mime-types": "^2.1.12" 855 | }, 856 | "engines": { 857 | "node": ">= 6" 858 | } 859 | }, 860 | "node_modules/fsevents": { 861 | "version": "2.3.3", 862 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 863 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 864 | "dev": true, 865 | "hasInstallScript": true, 866 | "optional": true, 867 | "os": [ 868 | "darwin" 869 | ], 870 | "engines": { 871 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 872 | } 873 | }, 874 | "node_modules/magic-string": { 875 | "version": "0.30.6", 876 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.6.tgz", 877 | "integrity": "sha512-n62qCLbPjNjyo+owKtveQxZFZTBm+Ms6YoGD23Wew6Vw337PElFNifQpknPruVRQV57kVShPnLGo9vWxVhpPvA==", 878 | "dependencies": { 879 | "@jridgewell/sourcemap-codec": "^1.4.15" 880 | }, 881 | "engines": { 882 | "node": ">=12" 883 | } 884 | }, 885 | "node_modules/mime-db": { 886 | "version": "1.52.0", 887 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 888 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 889 | "engines": { 890 | "node": ">= 0.6" 891 | } 892 | }, 893 | "node_modules/mime-types": { 894 | "version": "2.1.35", 895 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 896 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 897 | "dependencies": { 898 | "mime-db": "1.52.0" 899 | }, 900 | "engines": { 901 | "node": ">= 0.6" 902 | } 903 | }, 904 | "node_modules/nanoid": { 905 | "version": "3.3.7", 906 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 907 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 908 | "funding": [ 909 | { 910 | "type": "github", 911 | "url": "https://github.com/sponsors/ai" 912 | } 913 | ], 914 | "bin": { 915 | "nanoid": "bin/nanoid.cjs" 916 | }, 917 | "engines": { 918 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 919 | } 920 | }, 921 | "node_modules/picocolors": { 922 | "version": "1.0.0", 923 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 924 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 925 | }, 926 | "node_modules/postcss": { 927 | "version": "8.4.33", 928 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", 929 | "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", 930 | "funding": [ 931 | { 932 | "type": "opencollective", 933 | "url": "https://opencollective.com/postcss/" 934 | }, 935 | { 936 | "type": "tidelift", 937 | "url": "https://tidelift.com/funding/github/npm/postcss" 938 | }, 939 | { 940 | "type": "github", 941 | "url": "https://github.com/sponsors/ai" 942 | } 943 | ], 944 | "dependencies": { 945 | "nanoid": "^3.3.7", 946 | "picocolors": "^1.0.0", 947 | "source-map-js": "^1.0.2" 948 | }, 949 | "engines": { 950 | "node": "^10 || ^12 || >=14" 951 | } 952 | }, 953 | "node_modules/primeflex": { 954 | "version": "3.3.1", 955 | "resolved": "https://registry.npmjs.org/primeflex/-/primeflex-3.3.1.tgz", 956 | "integrity": "sha512-zaOq3YvcOYytbAmKv3zYc+0VNS9Wg5d37dfxZnveKBFPr7vEIwfV5ydrpiouTft8MVW6qNjfkaQphHSnvgQbpQ==" 957 | }, 958 | "node_modules/primeicons": { 959 | "version": "6.0.1", 960 | "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-6.0.1.tgz", 961 | "integrity": "sha512-KDeO94CbWI4pKsPnYpA1FPjo79EsY9I+M8ywoPBSf9XMXoe/0crjbUK7jcQEDHuc0ZMRIZsxH3TYLv4TUtHmAA==" 962 | }, 963 | "node_modules/primevue": { 964 | "version": "3.48.1", 965 | "resolved": "https://registry.npmjs.org/primevue/-/primevue-3.48.1.tgz", 966 | "integrity": "sha512-lyJ+E0ZCv2pR9jIpdPLBysU8zB2hOKrN7q78orloWelPx05zSYoMVKAWaqKTHNpunD52xffjaqovt1y6B/9XoQ==", 967 | "peerDependencies": { 968 | "vue": "^3.0.0" 969 | } 970 | }, 971 | "node_modules/proxy-from-env": { 972 | "version": "1.1.0", 973 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 974 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 975 | }, 976 | "node_modules/rollup": { 977 | "version": "4.9.6", 978 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.6.tgz", 979 | "integrity": "sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==", 980 | "dev": true, 981 | "dependencies": { 982 | "@types/estree": "1.0.5" 983 | }, 984 | "bin": { 985 | "rollup": "dist/bin/rollup" 986 | }, 987 | "engines": { 988 | "node": ">=18.0.0", 989 | "npm": ">=8.0.0" 990 | }, 991 | "optionalDependencies": { 992 | "@rollup/rollup-android-arm-eabi": "4.9.6", 993 | "@rollup/rollup-android-arm64": "4.9.6", 994 | "@rollup/rollup-darwin-arm64": "4.9.6", 995 | "@rollup/rollup-darwin-x64": "4.9.6", 996 | "@rollup/rollup-linux-arm-gnueabihf": "4.9.6", 997 | "@rollup/rollup-linux-arm64-gnu": "4.9.6", 998 | "@rollup/rollup-linux-arm64-musl": "4.9.6", 999 | "@rollup/rollup-linux-riscv64-gnu": "4.9.6", 1000 | "@rollup/rollup-linux-x64-gnu": "4.9.6", 1001 | "@rollup/rollup-linux-x64-musl": "4.9.6", 1002 | "@rollup/rollup-win32-arm64-msvc": "4.9.6", 1003 | "@rollup/rollup-win32-ia32-msvc": "4.9.6", 1004 | "@rollup/rollup-win32-x64-msvc": "4.9.6", 1005 | "fsevents": "~2.3.2" 1006 | } 1007 | }, 1008 | "node_modules/source-map-js": { 1009 | "version": "1.0.2", 1010 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1011 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1012 | "engines": { 1013 | "node": ">=0.10.0" 1014 | } 1015 | }, 1016 | "node_modules/vite": { 1017 | "version": "5.0.12", 1018 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz", 1019 | "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==", 1020 | "dev": true, 1021 | "dependencies": { 1022 | "esbuild": "^0.19.3", 1023 | "postcss": "^8.4.32", 1024 | "rollup": "^4.2.0" 1025 | }, 1026 | "bin": { 1027 | "vite": "bin/vite.js" 1028 | }, 1029 | "engines": { 1030 | "node": "^18.0.0 || >=20.0.0" 1031 | }, 1032 | "funding": { 1033 | "url": "https://github.com/vitejs/vite?sponsor=1" 1034 | }, 1035 | "optionalDependencies": { 1036 | "fsevents": "~2.3.3" 1037 | }, 1038 | "peerDependencies": { 1039 | "@types/node": "^18.0.0 || >=20.0.0", 1040 | "less": "*", 1041 | "lightningcss": "^1.21.0", 1042 | "sass": "*", 1043 | "stylus": "*", 1044 | "sugarss": "*", 1045 | "terser": "^5.4.0" 1046 | }, 1047 | "peerDependenciesMeta": { 1048 | "@types/node": { 1049 | "optional": true 1050 | }, 1051 | "less": { 1052 | "optional": true 1053 | }, 1054 | "lightningcss": { 1055 | "optional": true 1056 | }, 1057 | "sass": { 1058 | "optional": true 1059 | }, 1060 | "stylus": { 1061 | "optional": true 1062 | }, 1063 | "sugarss": { 1064 | "optional": true 1065 | }, 1066 | "terser": { 1067 | "optional": true 1068 | } 1069 | } 1070 | }, 1071 | "node_modules/vue": { 1072 | "version": "3.4.15", 1073 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.15.tgz", 1074 | "integrity": "sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==", 1075 | "dependencies": { 1076 | "@vue/compiler-dom": "3.4.15", 1077 | "@vue/compiler-sfc": "3.4.15", 1078 | "@vue/runtime-dom": "3.4.15", 1079 | "@vue/server-renderer": "3.4.15", 1080 | "@vue/shared": "3.4.15" 1081 | }, 1082 | "peerDependencies": { 1083 | "typescript": "*" 1084 | }, 1085 | "peerDependenciesMeta": { 1086 | "typescript": { 1087 | "optional": true 1088 | } 1089 | } 1090 | }, 1091 | "node_modules/vue-router": { 1092 | "version": "4.2.5", 1093 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", 1094 | "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", 1095 | "dependencies": { 1096 | "@vue/devtools-api": "^6.5.0" 1097 | }, 1098 | "funding": { 1099 | "url": "https://github.com/sponsors/posva" 1100 | }, 1101 | "peerDependencies": { 1102 | "vue": "^3.2.0" 1103 | } 1104 | } 1105 | } 1106 | } 1107 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-store", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "axios": "^1.6.7", 13 | "bootstrap": "^5.3.2", 14 | "bootstrap-icons": "^1.11.3", 15 | "primeflex": "^3.3.1", 16 | "primeicons": "^6.0.1", 17 | "primevue": "^3.48.1", 18 | "vue": "^3.4.15", 19 | "vue-router": "^4.2.5" 20 | }, 21 | "devDependencies": { 22 | "@vitejs/plugin-vue": "^5.0.3", 23 | "vite": "^5.0.11" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /frontend/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/frontend/public/favicon.ico -------------------------------------------------------------------------------- /frontend/src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | -------------------------------------------------------------------------------- /frontend/src/assets/AI.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/frontend/src/assets/AI.jpg -------------------------------------------------------------------------------- /frontend/src/assets/django.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/frontend/src/assets/django.jpeg -------------------------------------------------------------------------------- /frontend/src/assets/mobile.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/frontend/src/assets/mobile.jpg -------------------------------------------------------------------------------- /frontend/src/assets/python.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/frontend/src/assets/python.jpg -------------------------------------------------------------------------------- /frontend/src/components/CourseFilter.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 42 | 43 | -------------------------------------------------------------------------------- /frontend/src/components/CourseList.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 37 | 38 | -------------------------------------------------------------------------------- /frontend/src/components/Navbar.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 64 | -------------------------------------------------------------------------------- /frontend/src/components/icons/IconCommunity.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /frontend/src/components/icons/IconDocumentation.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /frontend/src/components/icons/IconEcosystem.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /frontend/src/components/icons/IconSupport.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /frontend/src/components/icons/IconTooling.vue: -------------------------------------------------------------------------------- 1 | 2 | 20 | -------------------------------------------------------------------------------- /frontend/src/components/icons/Navbar.vue: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/frontend/src/components/icons/Navbar.vue -------------------------------------------------------------------------------- /frontend/src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import router from './router' 4 | import PrimeVue from 'primevue/config'; 5 | 6 | // import 'bootstrap/dist/css/bootstrap.min.css' 7 | import 'bootstrap/dist/css/bootstrap-grid.min.css' 8 | // import 'bootstrap' 9 | // import 'bootstrap-icons/font/bootstrap-icons.css' 10 | 11 | 12 | const app = createApp(App) 13 | 14 | import 'primevue/resources/themes/aura-dark-indigo/theme.css' 15 | import 'primevue/resources/primevue.min.css' 16 | import 'primeicons/primeicons.css' 17 | import 'primeflex/primeflex.css' 18 | 19 | import Menubar from 'primevue/menubar'; 20 | import Button from 'primevue/button'; 21 | import Slider from 'primevue/slider'; 22 | import Panel from 'primevue/panel'; 23 | import Card from 'primevue/card'; 24 | import Checkbox from 'primevue/checkbox'; 25 | 26 | 27 | app.use(PrimeVue); 28 | app.use(router) 29 | 30 | app.component('Menubar', Menubar); 31 | app.component('Card', Card); 32 | app.component("Button", Button); 33 | app.component("Checkbox", Checkbox); 34 | 35 | app.mount('#app') 36 | -------------------------------------------------------------------------------- /frontend/src/router/index.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | import CoursesView from '@/views/CoursesView.vue' 3 | import CourseDetailView from '@/views/CourseDetailView.vue' 4 | 5 | const router = createRouter({ 6 | history: createWebHistory(import.meta.env.BASE_URL), 7 | routes: [ 8 | { 9 | path: '/', 10 | name: 'courselist', 11 | component: CoursesView 12 | }, 13 | { 14 | path: '/:courseId', 15 | name: 'coursedetail', 16 | component: () => import('../views/CourseDetailView.vue') 17 | } 18 | ] 19 | }) 20 | 21 | export default router 22 | -------------------------------------------------------------------------------- /frontend/src/temp-data.js: -------------------------------------------------------------------------------- 1 | import img1 from './assets/python.jpg' 2 | import img2 from './assets/AI.jpg' 3 | import img3 from './assets/mobile.jpg' 4 | import img4 from './assets/django.jpeg' 5 | 6 | 7 | export const courses = [ 8 | { 9 | id: 1, 10 | name: 'Python Basics', 11 | category_id: 1, 12 | category: 'Web Development', 13 | price: 30, 14 | image: img1 15 | 16 | }, 17 | { 18 | id: 2, 19 | name: 'AI Basics', 20 | category_id: 2, 21 | category: 'AI Development', 22 | price: 40, 23 | image: img2 24 | 25 | }, 26 | { 27 | id: 3, 28 | name: 'Flutter Basics', 29 | category_id: 3, 30 | category: 'Mobile Development', 31 | price: 50, 32 | image: img3 33 | 34 | }, 35 | { 36 | id: 4, 37 | name: 'Django Basics', 38 | category_id: 1, 39 | category: 'Web Development', 40 | price: 70, 41 | image: img4 42 | 43 | }, 44 | ] -------------------------------------------------------------------------------- /frontend/src/views/CourseDetailView.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 26 | 53 | -------------------------------------------------------------------------------- /frontend/src/views/CoursesView.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 12 | 65 | -------------------------------------------------------------------------------- /frontend/vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [ 9 | vue(), 10 | ], 11 | resolve: { 12 | alias: { 13 | '@': fileURLToPath(new URL('./src', import.meta.url)) 14 | } 15 | } 16 | }) 17 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AbdullahBakir97/Django-Vuejs-Courses-Filter/fba11439fdd05b61011c041123905c3d651b484f/requirements.txt --------------------------------------------------------------------------------