diff --git a/back/.gitignore b/back/.gitignore index 0aeae32..66651d4 100644 --- a/back/.gitignore +++ b/back/.gitignore @@ -87,4 +87,6 @@ __pycache__/ local_settings.py .env -db.sqlite3 \ No newline at end of file +db.sqlite3 + +migrations/00* \ No newline at end of file diff --git a/back/api/admin.py b/back/api/admin.py index 8c38f3f..fd67800 100644 --- a/back/api/admin.py +++ b/back/api/admin.py @@ -1,3 +1,5 @@ from django.contrib import admin +from .models import Product # Register your models here. +admin.site.register(Product) diff --git a/back/api/migrations/0002_rename_task_product.py b/back/api/migrations/0002_rename_task_product.py new file mode 100644 index 0000000..31c1020 --- /dev/null +++ b/back/api/migrations/0002_rename_task_product.py @@ -0,0 +1,17 @@ +# Generated by Django 5.0.4 on 2024-04-26 11:26 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0001_initial'), + ] + + operations = [ + migrations.RenameModel( + old_name='Task', + new_name='Product', + ), + ] diff --git a/back/api/migrations/0003_product_model3d.py b/back/api/migrations/0003_product_model3d.py new file mode 100644 index 0000000..a6f5732 --- /dev/null +++ b/back/api/migrations/0003_product_model3d.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.4 on 2024-04-26 12:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0002_rename_task_product'), + ] + + operations = [ + migrations.AddField( + model_name='product', + name='model3d', + field=models.FileField(default=None, null=True, upload_to=''), + ), + ] diff --git a/back/api/migrations/0004_product_description.py b/back/api/migrations/0004_product_description.py new file mode 100644 index 0000000..4b755d0 --- /dev/null +++ b/back/api/migrations/0004_product_description.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.4 on 2024-04-26 12:57 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0003_product_model3d'), + ] + + operations = [ + migrations.AddField( + model_name='product', + name='description', + field=models.TextField(default=None, null=True), + ), + ] diff --git a/back/api/models.py b/back/api/models.py index 5c59ecb..809c60a 100644 --- a/back/api/models.py +++ b/back/api/models.py @@ -1,8 +1,11 @@ from django.db import models + # Create your models here. -class Task(models.Model): +class Product(models.Model): title = models.CharField(max_length=100) + model3d = models.FileField(default=None, null=True) + description = models.TextField(default=None, null=True) def __str__(self): return self.title diff --git a/back/api/serializers.py b/back/api/serializers.py index 94f05b6..758fdd7 100644 --- a/back/api/serializers.py +++ b/back/api/serializers.py @@ -1,11 +1,13 @@ from rest_framework import routers, serializers, viewsets -from .models import Task +from .models import Product -class TaskSerializer(serializers.HyperlinkedModelSerializer): +class ProductSerializer(serializers.HyperlinkedModelSerializer): class Meta: - model = Task + model = Product fields = [ "id", "title", + "model3d", + "description" ] diff --git a/back/api/views.py b/back/api/views.py index e07d33a..a1dc6fb 100644 --- a/back/api/views.py +++ b/back/api/views.py @@ -2,22 +2,22 @@ from django.shortcuts import render from rest_framework.parsers import JSONParser from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponse, JsonResponse -from .serializers import TaskSerializer -from .models import Task +from .serializers import ProductSerializer +from .models import Product @csrf_exempt -def tasks(request): +def products(request): """ List all task snippets """ if request.method == "GET": - tasks = Task.objects.all() - serializer = TaskSerializer(tasks, many=True) + tasks = Product.objects.all() + serializer = ProductSerializer(tasks, many=True) return JsonResponse(serializer.data, safe=False) elif request.method == "POST": data = JSONParser().parse(request) - serializer = TaskSerializer(data=data) + serializer = ProductSerializer(data=data) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data, status=201) diff --git a/back/back/settings.py b/back/back/settings.py index e7716fa..4b6207b 100644 --- a/back/back/settings.py +++ b/back/back/settings.py @@ -25,9 +25,29 @@ SECRET_KEY = "django-insecure-ly8rk@zb&ne*-063&q-=81!d@8q0hh4$&q!_7mtqc81(rlejqd # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = [] - - +ALLOWED_HOSTS = [ + "localhost", + "localhost:8000", + "127.0.0.1", + "127.0.0.1:8000", + "192.168.103.159", + "192.168.103.159:8000", +] +CSRF_TRUSTED_ORIGINS = ( + "http://localhost", + "http://192.168.103.159", +) +CORS_ORIGIN_ALLOW_ALL = False +CORS_ORIGIN_WHITELIST = [ + "null", + "http://localhost", + "http://localhost:4173", + "http://localhost:5173", + "http://localhost:8000", + "http://127.0.0.1", + "http://192.168.103.159", + "http://192.168.103.159:8000", +] # Application definition INSTALLED_APPS = [ @@ -37,6 +57,7 @@ INSTALLED_APPS = [ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "corsheaders", "api", "rest_framework", ] @@ -45,6 +66,7 @@ MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", + "corsheaders.middleware.CorsMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", @@ -122,4 +144,34 @@ STATIC_URL = "static/" # Default primary key field type # https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field + DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" +LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "verbose": { + "format": "{levelname} {asctime} {module} {process:d} {thread:d} {message}", + "style": "{", + }, + "large": { + "format": "%(asctime)s %(levelname)s %(process)d %(filename)s:%(lineno)d " + + "%(funcName)s %(message)s " + }, + "simple": { + "format": "{levelname} {asctime} {module} {message}", + "style": "{", + }, + }, + "handlers": { + "console": { + "level": "INFO", + "class": "logging.StreamHandler", + "formatter": "large", + }, + }, + "root": { + "handlers": ["console"], + "level": "INFO", + }, +} diff --git a/back/back/urls.py b/back/back/urls.py index 5a1c43d..8af0b95 100644 --- a/back/back/urls.py +++ b/back/back/urls.py @@ -19,6 +19,6 @@ from django.urls import path from api import views urlpatterns = [ - path('admin/', admin.site.urls), - path('api/', views.tasks), + path("admin/", admin.site.urls), + path("api/products", views.products), ] diff --git a/front/.env.development b/front/.env.development new file mode 100644 index 0000000..1795ce7 --- /dev/null +++ b/front/.env.development @@ -0,0 +1 @@ +VITE_SERVER_URL='http://localhost:8000' \ No newline at end of file diff --git a/front/.gitignore b/front/.gitignore index 8ee54e8..a547bf3 100644 --- a/front/.gitignore +++ b/front/.gitignore @@ -8,23 +8,17 @@ pnpm-debug.log* lerna-debug.log* node_modules -.DS_Store dist dist-ssr -coverage *.local -/cypress/videos/ -/cypress/screenshots/ - # Editor directories and files .vscode/* !.vscode/extensions.json .idea +.DS_Store *.suo *.ntvs* *.njsproj *.sln *.sw? - -*.tsbuildinfo diff --git a/front/README.md b/front/README.md index cfdbcc6..0bfecb0 100644 --- a/front/README.md +++ b/front/README.md @@ -1,29 +1,9 @@ -# interactive-table +# Vue 3 + TypeScript + Vite -This template should help get you started developing with Vue 3 in Vite. +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + diff --git a/front/jsconfig.json b/front/jsconfig.json deleted file mode 100644 index 5a1f2d2..0000000 --- a/front/jsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "compilerOptions": { - "paths": { - "@/*": ["./src/*"] - } - }, - "exclude": ["node_modules", "dist"] -} diff --git a/front/package-lock.json b/front/package-lock.json index 6e40974..c22b4c1 100644 --- a/front/package-lock.json +++ b/front/package-lock.json @@ -1,18 +1,23 @@ { - "name": "interactive-table", + "name": "front", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "interactive-table", + "name": "front", "version": "0.0.0", "dependencies": { + "pinia": "^2.1.7", + "reset-css": "^5.0.2", "vue": "^3.4.21" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", - "vite": "^5.2.8" + "sass": "^1.75.0", + "typescript": "^5.2.2", + "vite": "^5.2.0", + "vue-tsc": "^2.0.6" } }, "node_modules/@babel/parser": { @@ -626,6 +631,34 @@ "vue": "^3.2.25" } }, + "node_modules/@volar/language-core": { + "version": "2.2.0-alpha.10", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.0-alpha.10.tgz", + "integrity": "sha512-njVJLtpu0zMvDaEk7K5q4BRpOgbyEUljU++un9TfJoJNhxG0z/hWwpwgTRImO42EKvwIxF3XUzeMk+qatAFy7Q==", + "dev": true, + "dependencies": { + "@volar/source-map": "2.2.0-alpha.10" + } + }, + "node_modules/@volar/source-map": { + "version": "2.2.0-alpha.10", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.0-alpha.10.tgz", + "integrity": "sha512-nrdWApVkP5cksAnDEyy1JD9rKdwOJsEq1B+seWO4vNXmZNcxQQCx4DULLBvKt7AzRUAQiAuw5aQkb9RBaSqdVA==", + "dev": true, + "dependencies": { + "muggle-string": "^0.4.0" + } + }, + "node_modules/@volar/typescript": { + "version": "2.2.0-alpha.10", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.2.0-alpha.10.tgz", + "integrity": "sha512-GCa0vTVVdA9ULUsu2Rx7jwsIuyZQPvPVT9o3NrANTbYv+523Ao1gv3glC5vzNSDPM6bUl37r94HbCj7KINQr+g==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.2.0-alpha.10", + "path-browserify": "^1.0.1" + } + }, "node_modules/@vue/compiler-core": { "version": "3.4.25", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.25.tgz", @@ -672,6 +705,34 @@ "@vue/shared": "3.4.25" } }, + "node_modules/@vue/devtools-api": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", + "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" + }, + "node_modules/@vue/language-core": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.14.tgz", + "integrity": "sha512-3q8mHSNcGTR7sfp2X6jZdcb4yt8AjBXAfKk0qkZIh7GAJxOnoZ10h5HToZglw4ToFvAnq+xu/Z2FFbglh9Icag==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.2.0-alpha.10", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@vue/reactivity": { "version": "3.4.25", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.25.tgz", @@ -716,11 +777,99 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.25.tgz", "integrity": "sha512-k0yappJ77g2+KNrIaF0FFnzwLvUBLUYr8VOwz+/6vLsmItFp51AcxLL7Ey3iPd7BIRyWPOcqUjMnm7OkahXllA==" }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -775,6 +924,18 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -789,6 +950,87 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/magic-string": { "version": "0.30.10", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", @@ -797,6 +1039,27 @@ "@jridgewell/sourcemap-codec": "^1.4.15" } }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -814,11 +1077,88 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -846,6 +1186,23 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reset-css": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/reset-css/-/reset-css-5.0.2.tgz", + "integrity": "sha512-YtgUGSq5z5W0NPSjsBW7ys7rtWa8P8AiE7S6Fg3d1TQCPpAodgYyLuZYlU0AOsLtprk/fC9ormHN/0pAavVIDw==" + }, "node_modules/rollup": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.16.4.tgz", @@ -881,6 +1238,38 @@ "fsevents": "~2.3.2" } }, + "node_modules/sass": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.75.0.tgz", + "integrity": "sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/source-map-js": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", @@ -889,6 +1278,31 @@ "node": ">=0.10.0" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/vite": { "version": "5.2.10", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz", @@ -963,6 +1377,39 @@ "optional": true } } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.14.tgz", + "integrity": "sha512-DgAO3U1cnCHOUO7yB35LENbkapeRsBZ7Ugq5hGz/QOHny0+1VQN8eSwSBjYbjLVPfvfw6EY7sNPjbuHHUhckcg==", + "dev": true, + "dependencies": { + "@volar/typescript": "2.2.0-alpha.10", + "@vue/language-core": "2.0.14", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } } diff --git a/front/package.json b/front/package.json index 2c83663..43db79e 100644 --- a/front/package.json +++ b/front/package.json @@ -1,18 +1,23 @@ { - "name": "interactive-table", - "version": "0.0.0", + "name": "front", "private": true, + "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", - "build": "vite build", + "build": "vue-tsc && vite build", "preview": "vite preview" }, "dependencies": { + "pinia": "^2.1.7", + "reset-css": "^5.0.2", "vue": "^3.4.21" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", - "vite": "^5.2.8" + "sass": "^1.75.0", + "typescript": "^5.2.2", + "vite": "^5.2.0", + "vue-tsc": "^2.0.6" } } diff --git a/front/public/favicon.ico b/front/public/favicon.ico deleted file mode 100644 index df36fcf..0000000 Binary files a/front/public/favicon.ico and /dev/null differ diff --git a/front/public/vite.svg b/front/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/front/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front/src/App.vue b/front/src/App.vue index 633a5df..38e62cb 100644 --- a/front/src/App.vue +++ b/front/src/App.vue @@ -1,47 +1,42 @@ - - - +
Проекты Кустарщины
+
+
+ {{ products.list.find(el => el.id == state.active_product)?.description }} +
+
+ + \ No newline at end of file diff --git a/front/src/assets/base.css b/front/src/assets/base.css deleted file mode 100644 index 8816868..0000000 --- a/front/src/assets/base.css +++ /dev/null @@ -1,86 +0,0 @@ -/* color palette from */ -:root { - --vt-c-white: #ffffff; - --vt-c-white-soft: #f8f8f8; - --vt-c-white-mute: #f2f2f2; - - --vt-c-black: #181818; - --vt-c-black-soft: #222222; - --vt-c-black-mute: #282828; - - --vt-c-indigo: #2c3e50; - - --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); - --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); - --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); - --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); - - --vt-c-text-light-1: var(--vt-c-indigo); - --vt-c-text-light-2: rgba(60, 60, 60, 0.66); - --vt-c-text-dark-1: var(--vt-c-white); - --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); -} - -/* semantic color variables for this project */ -:root { - --color-background: var(--vt-c-white); - --color-background-soft: var(--vt-c-white-soft); - --color-background-mute: var(--vt-c-white-mute); - - --color-border: var(--vt-c-divider-light-2); - --color-border-hover: var(--vt-c-divider-light-1); - - --color-heading: var(--vt-c-text-light-1); - --color-text: var(--vt-c-text-light-1); - - --section-gap: 160px; -} - -@media (prefers-color-scheme: dark) { - :root { - --color-background: var(--vt-c-black); - --color-background-soft: var(--vt-c-black-soft); - --color-background-mute: var(--vt-c-black-mute); - - --color-border: var(--vt-c-divider-dark-2); - --color-border-hover: var(--vt-c-divider-dark-1); - - --color-heading: var(--vt-c-text-dark-1); - --color-text: var(--vt-c-text-dark-2); - } -} - -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - font-weight: normal; -} - -body { - min-height: 100vh; - color: var(--color-text); - background: var(--color-background); - transition: - color 0.5s, - background-color 0.5s; - line-height: 1.6; - font-family: - Inter, - -apple-system, - BlinkMacSystemFont, - 'Segoe UI', - Roboto, - Oxygen, - Ubuntu, - Cantarell, - 'Fira Sans', - 'Droid Sans', - 'Helvetica Neue', - sans-serif; - font-size: 15px; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} diff --git a/front/src/assets/logo.svg b/front/src/assets/logo.svg deleted file mode 100644 index 7565660..0000000 --- a/front/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/front/src/assets/main.css b/front/src/assets/main.css deleted file mode 100644 index 36fb845..0000000 --- a/front/src/assets/main.css +++ /dev/null @@ -1,35 +0,0 @@ -@import './base.css'; - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - font-weight: normal; -} - -a, -.green { - text-decoration: none; - color: hsla(160, 100%, 37%, 1); - transition: 0.4s; - padding: 3px; -} - -@media (hover: hover) { - a:hover { - background-color: hsla(160, 100%, 37%, 0.2); - } -} - -@media (min-width: 1024px) { - body { - display: flex; - place-items: center; - } - - #app { - display: grid; - grid-template-columns: 1fr 1fr; - padding: 0 2rem; - } -} diff --git a/front/src/assets/main.scss b/front/src/assets/main.scss new file mode 100644 index 0000000..8a2e2f5 --- /dev/null +++ b/front/src/assets/main.scss @@ -0,0 +1,24 @@ +@import '../../node_modules/reset-css/sass/reset'; +body { + // background-color: red; +} + +.container { + display: grid; + grid-template-columns: repeat(5, 1fr); + grid-template-rows: repeat(5, 1fr); + grid-column-gap: 0px; + grid-row-gap: 0px; +} + +.sidebar { + grid-area: 1 / 1 / 6 / 2; +} + +.header { + grid-area: 1 / 2 / 2 / 6; +} + +.main { + grid-area: 2 / 2 / 6 / 6; +} \ No newline at end of file diff --git a/front/src/assets/vue.svg b/front/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/front/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/front/src/components/HelloWorld.vue b/front/src/components/HelloWorld.vue index 5fb372c..7b25f3f 100644 --- a/front/src/components/HelloWorld.vue +++ b/front/src/components/HelloWorld.vue @@ -1,44 +1,38 @@ - diff --git a/front/src/components/TheWelcome.vue b/front/src/components/TheWelcome.vue deleted file mode 100644 index dab9536..0000000 --- a/front/src/components/TheWelcome.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - diff --git a/front/src/components/WelcomeItem.vue b/front/src/components/WelcomeItem.vue deleted file mode 100644 index 6d7086a..0000000 --- a/front/src/components/WelcomeItem.vue +++ /dev/null @@ -1,87 +0,0 @@ - - - diff --git a/front/src/components/icons/IconCommunity.vue b/front/src/components/icons/IconCommunity.vue deleted file mode 100644 index 2dc8b05..0000000 --- a/front/src/components/icons/IconCommunity.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/front/src/components/icons/IconDocumentation.vue b/front/src/components/icons/IconDocumentation.vue deleted file mode 100644 index 6d4791c..0000000 --- a/front/src/components/icons/IconDocumentation.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/front/src/components/icons/IconEcosystem.vue b/front/src/components/icons/IconEcosystem.vue deleted file mode 100644 index c3a4f07..0000000 --- a/front/src/components/icons/IconEcosystem.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/front/src/components/icons/IconSupport.vue b/front/src/components/icons/IconSupport.vue deleted file mode 100644 index 7452834..0000000 --- a/front/src/components/icons/IconSupport.vue +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/front/src/components/icons/IconTooling.vue b/front/src/components/icons/IconTooling.vue deleted file mode 100644 index 660598d..0000000 --- a/front/src/components/icons/IconTooling.vue +++ /dev/null @@ -1,19 +0,0 @@ - - diff --git a/front/src/constants.ts b/front/src/constants.ts new file mode 100644 index 0000000..fd03d9f --- /dev/null +++ b/front/src/constants.ts @@ -0,0 +1 @@ +export const SERVER_URL = import.meta.env.VITE_SERVER_URL ?? '' \ No newline at end of file diff --git a/front/src/main.js b/front/src/main.js deleted file mode 100644 index 0ac3a5f..0000000 --- a/front/src/main.js +++ /dev/null @@ -1,6 +0,0 @@ -import './assets/main.css' - -import { createApp } from 'vue' -import App from './App.vue' - -createApp(App).mount('#app') diff --git a/front/src/main.ts b/front/src/main.ts new file mode 100644 index 0000000..da8ba40 --- /dev/null +++ b/front/src/main.ts @@ -0,0 +1,8 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import './assets/main.scss' + +import App from './App.vue' +const pinia = createPinia() + +createApp(App).use(pinia).mount('#app') diff --git a/front/src/stores/product.ts b/front/src/stores/product.ts new file mode 100644 index 0000000..b88842c --- /dev/null +++ b/front/src/stores/product.ts @@ -0,0 +1,31 @@ +import { defineStore } from 'pinia' +import { SERVER_URL } from '../constants' + +export const useProductStore = defineStore('product', { + state: () => { + return { + // for initially empty lists + list: [] as ProductInfo[], + } + }, + actions: { + async getData() { + try { + const res = await fetch(`${SERVER_URL}/api/products`) + const data = await res.json() + if (data.length) { + this.list = data + } + } catch (error) { + this.list = [] + } + }, + } +}) + +interface ProductInfo { + id: number + title: string + model3d: string + description: string +} \ No newline at end of file diff --git a/front/src/vite-env.d.ts b/front/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/front/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/front/tsconfig.json b/front/tsconfig.json new file mode 100644 index 0000000..9e03e60 --- /dev/null +++ b/front/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/front/tsconfig.node.json b/front/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/front/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/front/vite.config.js b/front/vite.config.js deleted file mode 100644 index 5c45e1d..0000000 --- a/front/vite.config.js +++ /dev/null @@ -1,16 +0,0 @@ -import { fileURLToPath, URL } from 'node:url' - -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [ - vue(), - ], - resolve: { - alias: { - '@': fileURLToPath(new URL('./src', import.meta.url)) - } - } -}) diff --git a/front/vite.config.ts b/front/vite.config.ts new file mode 100644 index 0000000..05c1740 --- /dev/null +++ b/front/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], +}) diff --git a/poetry.lock b/poetry.lock index 3df4f5d..9973d8a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -48,6 +48,21 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""} argon2 = ["argon2-cffi (>=19.1.0)"] bcrypt = ["bcrypt"] +[[package]] +name = "django-cors-headers" +version = "4.3.1" +description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." +optional = false +python-versions = ">=3.8" +files = [ + {file = "django-cors-headers-4.3.1.tar.gz", hash = "sha256:0bf65ef45e606aff1994d35503e6b677c0b26cafff6506f8fd7187f3be840207"}, + {file = "django_cors_headers-4.3.1-py3-none-any.whl", hash = "sha256:0b1fd19297e37417fc9f835d39e45c8c642938ddba1acce0c1753d3edef04f36"}, +] + +[package.dependencies] +asgiref = ">=3.6" +Django = ">=3.2" + [[package]] name = "djangorestframework" version = "3.15.1" @@ -169,4 +184,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "ea5393c8efad8907962e4c7acd944fb7ba86ead7476ce46af145642a81f9e036" +content-hash = "495f3307a5adc4ecd221d1bae60d111bb7a338b917931121336cc556c40fd8ec" diff --git a/pyproject.toml b/pyproject.toml index dd23542..e9f7127 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,6 +10,7 @@ python = "^3.10" Django = "^5.0.4" djangorestframework = "^3.15.1" taskipy = "^1.12.2" +django-cors-headers = "^4.3.1" [build-system] @@ -17,6 +18,6 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.taskipy.tasks] -server = "manage.py runserver" +server = "back/manage.py runserver 0.0.0.0:8000" front = "cd front && npm run build && npm run preview" front_dev = "cd front && npm run dev" \ No newline at end of file diff --git a/подставка.fbx b/подставка.fbx new file mode 100644 index 0000000..87500b9 Binary files /dev/null and b/подставка.fbx differ diff --git a/подставка_YdPFIz0.fbx b/подставка_YdPFIz0.fbx new file mode 100644 index 0000000..87500b9 Binary files /dev/null and b/подставка_YdPFIz0.fbx differ diff --git a/подставка_bTXKvjX.fbx b/подставка_bTXKvjX.fbx new file mode 100644 index 0000000..87500b9 Binary files /dev/null and b/подставка_bTXKvjX.fbx differ