From 3fa3766356abc34791e48d591c676f7cb1c73d23 Mon Sep 17 00:00:00 2001 From: Data-Name-ID Date: Sun, 31 Mar 2024 21:44:14 +0300 Subject: [PATCH 1/6] [fix] cors headers --- backend/project/config/settings.py | 7 +++++++ backend/requirements/dev.txt | 6 ++---- backend/requirements/lint.txt | 2 ++ backend/requirements/prod.txt | 1 + backend/requirements/test.txt | 1 - 5 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 backend/requirements/lint.txt delete mode 100644 backend/requirements/test.txt diff --git a/backend/project/config/settings.py b/backend/project/config/settings.py index 49aec92..f3239b1 100755 --- a/backend/project/config/settings.py +++ b/backend/project/config/settings.py @@ -49,6 +49,7 @@ INSTALLED_APPS = [ # third party apps "rest_framework", "rest_framework_simplejwt", + "corsheaders", "drf_yasg", # project apps "users.apps.UsersConfig", @@ -63,6 +64,8 @@ MIDDLEWARE = [ "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", + "corsheaders.middleware.CorsMiddleware", + "django.middleware.common.CommonMiddleware", ] ROOT_URLCONF = "config.urls" @@ -151,3 +154,7 @@ REST_FRAMEWORK = { if DEBUG and not (TESTING or MIGRATING): register_debug_toolbar() + +CORS_ALLOWED_ORIGINS = [ + "http://158.160.56.239:8080", +] diff --git a/backend/requirements/dev.txt b/backend/requirements/dev.txt index 626fcba..c2b2108 100644 --- a/backend/requirements/dev.txt +++ b/backend/requirements/dev.txt @@ -1,6 +1,4 @@ -black -sort-requirements -ruff==0.3.4 +django-debug-toolbar -r prod.txt --r test.txt +-r lint.txt diff --git a/backend/requirements/lint.txt b/backend/requirements/lint.txt new file mode 100644 index 0000000..40b7f22 --- /dev/null +++ b/backend/requirements/lint.txt @@ -0,0 +1,2 @@ +sort-requirements +ruff diff --git a/backend/requirements/prod.txt b/backend/requirements/prod.txt index b5c3756..9e72ac0 100644 --- a/backend/requirements/prod.txt +++ b/backend/requirements/prod.txt @@ -8,3 +8,4 @@ djangorestframework-simplejwt==5.3.1 django-filter==24.2 Pillow==10.2.0 drf-yasg==1.21.7 +django-cors-headers diff --git a/backend/requirements/test.txt b/backend/requirements/test.txt deleted file mode 100644 index 2e685ea..0000000 --- a/backend/requirements/test.txt +++ /dev/null @@ -1 +0,0 @@ -django-debug-toolbar==4.3.0 From c3d39ba55bbf08164a76bc0e1d57146364c1e2b9 Mon Sep 17 00:00:00 2001 From: Data-Name-ID Date: Sun, 31 Mar 2024 21:57:51 +0300 Subject: [PATCH 2/6] [fix] cors urls --- backend/project/config/settings.py | 1 + backend/project/teams/{serializer.py => serializers.py} | 0 backend/project/teams/views.py | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) rename backend/project/teams/{serializer.py => serializers.py} (100%) diff --git a/backend/project/config/settings.py b/backend/project/config/settings.py index f3239b1..d249569 100755 --- a/backend/project/config/settings.py +++ b/backend/project/config/settings.py @@ -157,4 +157,5 @@ if DEBUG and not (TESTING or MIGRATING): CORS_ALLOWED_ORIGINS = [ "http://158.160.56.239:8080", + "http://158.160.56.239:3000", ] diff --git a/backend/project/teams/serializer.py b/backend/project/teams/serializers.py similarity index 100% rename from backend/project/teams/serializer.py rename to backend/project/teams/serializers.py diff --git a/backend/project/teams/views.py b/backend/project/teams/views.py index 8beef7c..2020407 100644 --- a/backend/project/teams/views.py +++ b/backend/project/teams/views.py @@ -5,7 +5,7 @@ from rest_framework.views import APIView from teams.models import Team -from .serializers import TeamSerializer +from teams.serializers import TeamSerializer class AddUserToTeam(APIView): From c0f48eae12be5b51d5273cce7e94e2187dfc37c7 Mon Sep 17 00:00:00 2001 From: Data-Name-ID Date: Sun, 31 Mar 2024 22:07:33 +0300 Subject: [PATCH 3/6] [feat] team view & [fix] cors --- backend/project/config/settings.py | 6 +-- backend/project/config/urls.py | 2 + .../0002_alter_notification_content.py | 18 ++++++++ .../project/teams/migrations/0001_initial.py | 45 +++++++++++++++++++ backend/project/teams/models.py | 5 +-- backend/project/teams/views.py | 14 ++++-- 6 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 backend/project/notifications/migrations/0002_alter_notification_content.py create mode 100644 backend/project/teams/migrations/0001_initial.py diff --git a/backend/project/config/settings.py b/backend/project/config/settings.py index d249569..f8f5b42 100755 --- a/backend/project/config/settings.py +++ b/backend/project/config/settings.py @@ -54,6 +54,7 @@ INSTALLED_APPS = [ # project apps "users.apps.UsersConfig", "notifications.apps.NotificationsConfig", + "teams.apps.TeamsConfig", ] MIDDLEWARE = [ @@ -155,7 +156,4 @@ REST_FRAMEWORK = { if DEBUG and not (TESTING or MIGRATING): register_debug_toolbar() -CORS_ALLOWED_ORIGINS = [ - "http://158.160.56.239:8080", - "http://158.160.56.239:3000", -] +CORS_ORIGIN_ALLOW_ALL = True diff --git a/backend/project/config/urls.py b/backend/project/config/urls.py index 0e46697..ea0a506 100755 --- a/backend/project/config/urls.py +++ b/backend/project/config/urls.py @@ -8,9 +8,11 @@ from drf_yasg import openapi from drf_yasg.views import get_schema_view from rest_framework import permissions, routers from users.views import UserViewSet +from teams.views import TeamsViewSet router = routers.DefaultRouter() router.register("users", UserViewSet) +router.register("teams", TeamsViewSet) schema_view = get_schema_view( openapi.Info(title="SkillHub API", default_version="v1"), diff --git a/backend/project/notifications/migrations/0002_alter_notification_content.py b/backend/project/notifications/migrations/0002_alter_notification_content.py new file mode 100644 index 0000000..0bdbb42 --- /dev/null +++ b/backend/project/notifications/migrations/0002_alter_notification_content.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.11 on 2024-03-31 19:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('notifications', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='notification', + name='content', + field=models.TextField(verbose_name='содержание'), + ), + ] diff --git a/backend/project/teams/migrations/0001_initial.py b/backend/project/teams/migrations/0001_initial.py new file mode 100644 index 0000000..47871cd --- /dev/null +++ b/backend/project/teams/migrations/0001_initial.py @@ -0,0 +1,45 @@ +# Generated by Django 4.2.11 on 2024-03-31 19:06 + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('users', '0002_rename_technologies_user_skills'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Vacancy', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, verbose_name='название вакансии')), + ('start_date', models.DateField(blank=True, null=True, verbose_name='дата начала диапазона возраста участников')), + ('end_date', models.DateField(blank=True, null=True, verbose_name='дата конец диапазона возраста участников')), + ('skills', models.ManyToManyField(blank=True, to='users.skill', verbose_name='Технологии')), + ('specialization', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='users.specialization', verbose_name='специализация')), + ], + ), + migrations.CreateModel( + name='Team', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.TextField(verbose_name='описание команды')), + ('name', models.CharField(max_length=255, verbose_name='название команды')), + ('avatar', models.ImageField(blank=True, upload_to='teams_avatars', verbose_name='аватарка')), + ('count_of_members', models.IntegerField(null=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxLengthValidator(5)], verbose_name='количество участников')), + ('country', models.CharField(blank=True, max_length=255, verbose_name='страна')), + ('city', models.CharField(blank=True, max_length=255, verbose_name='город')), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='teams', to=settings.AUTH_USER_MODEL)), + ('members', models.ManyToManyField(to=settings.AUTH_USER_MODEL, verbose_name='участники')), + ('vacancies', models.ManyToManyField(to='teams.vacancy', verbose_name='вакансии')), + ], + ), + ] diff --git a/backend/project/teams/models.py b/backend/project/teams/models.py index f1f72d7..2d906b4 100644 --- a/backend/project/teams/models.py +++ b/backend/project/teams/models.py @@ -48,15 +48,11 @@ class Team(models.Model): members = models.ManyToManyField( users.models.User, - blank=True, - unique=True, verbose_name="участники", ) vacancies = models.ManyToManyField( Vacancy, - blank=True, - unique=True, verbose_name="вакансии", ) @@ -90,6 +86,7 @@ class Team(models.Model): author = models.ForeignKey( users.models.User, on_delete=models.CASCADE, + related_name="teams", ) def __str__(self): diff --git a/backend/project/teams/views.py b/backend/project/teams/views.py index 2020407..b5cfe1b 100644 --- a/backend/project/teams/views.py +++ b/backend/project/teams/views.py @@ -1,12 +1,12 @@ -from backend.project.users.models import User +from users.models import User from rest_framework import status from rest_framework.response import Response from rest_framework.views import APIView from teams.models import Team - +from rest_framework.viewsets import ModelViewSet from teams.serializers import TeamSerializer - +from rest_framework.permissions import IsAuthenticated class AddUserToTeam(APIView): def post(self, request, team_id, user_id): # noqa: ARG002 @@ -25,3 +25,11 @@ class AddUserToTeam(APIView): team.members.add(user) team_serializer = TeamSerializer(team) return Response(team_serializer.data, status=status.HTTP_200_OK) + + +class TeamsViewSet(ModelViewSet): + http_method_names = ("get",) + + queryset = Team.objects.all() + serializer_class = TeamSerializer + permission_classes = [IsAuthenticated] From 45c0bbad2e42aa5b138148d73ceb5d46aa3a209c Mon Sep 17 00:00:00 2001 From: Data-Name-ID Date: Sun, 31 Mar 2024 22:56:35 +0300 Subject: [PATCH 4/6] [ref] sort imports --- backend/project/config/urls.py | 2 +- backend/project/teams/views.py | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/backend/project/config/urls.py b/backend/project/config/urls.py index ea0a506..5255a24 100755 --- a/backend/project/config/urls.py +++ b/backend/project/config/urls.py @@ -7,8 +7,8 @@ from django.urls import include, path from drf_yasg import openapi from drf_yasg.views import get_schema_view from rest_framework import permissions, routers -from users.views import UserViewSet from teams.views import TeamsViewSet +from users.views import UserViewSet router = routers.DefaultRouter() router.register("users", UserViewSet) diff --git a/backend/project/teams/views.py b/backend/project/teams/views.py index b5cfe1b..4415cea 100644 --- a/backend/project/teams/views.py +++ b/backend/project/teams/views.py @@ -1,12 +1,13 @@ -from users.models import User from rest_framework import status +from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView +from rest_framework.viewsets import ModelViewSet +from users.models import User from teams.models import Team -from rest_framework.viewsets import ModelViewSet from teams.serializers import TeamSerializer -from rest_framework.permissions import IsAuthenticated + class AddUserToTeam(APIView): def post(self, request, team_id, user_id): # noqa: ARG002 From e3de361f8cf0503db7313e9b561103a32496f460 Mon Sep 17 00:00:00 2001 From: cue Date: Mon, 1 Apr 2024 00:36:43 +0300 Subject: [PATCH 5/6] [feat]: Added test registration --- frontend/package-lock.json | 123 ++++-------------- frontend/package.json | 15 ++- .../src/components/shared/ui/textarea.tsx | 24 ++++ .../src/components/widgets/Header/AuthAPI.ts | 29 ++++- .../components/widgets/Header/AuthForm.tsx | 81 +++++++----- 5 files changed, 135 insertions(+), 137 deletions(-) create mode 100644 frontend/src/components/shared/ui/textarea.tsx diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5d1f8b4..2c4a611 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,11 +1,11 @@ { - "name": "shadcn_ui_ex", + "name": "skill-hub", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "shadcn_ui_ex", + "name": "skill-hub", "version": "0.0.0", "dependencies": { "@hookform/resolvers": "^3.3.4", @@ -17,11 +17,16 @@ "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-tabs": "^1.0.4", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.19", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cn-decorator": "^2.1.0", + "cross": "^1.0.0", "i18next": "^23.10.1", + "less": "^4.2.0", "lucide-react": "^0.363.0", + "postcss": "^8.4.38", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.2", @@ -29,7 +34,10 @@ "react-router": "^6.22.3", "react-router-dom": "^6.22.3", "tailwind-merge": "^2.2.2", + "tailwindcss": "^3.4.3", "tailwindcss-animate": "^1.0.7", + "typescript": "^5.2.2", + "vite": "^5.2.0", "zod": "^3.22.4" }, "devDependencies": { @@ -38,19 +46,12 @@ "@types/react-dom": "^18.2.22", "@typescript-eslint/eslint-plugin": "^7.2.0", "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react-swc": "^3.5.0", - "autoprefixer": "^10.4.19", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", - "less": "^4.2.0", - "postcss": "^8.4.38", - "prettier": "^3.2.5", - "tailwindcss": "^3.4.3", - "typescript": "^5.2.2", - "vite": "^5.2.0" + "prettier": "^3.2.5" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -91,7 +92,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "aix" @@ -107,7 +107,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -123,7 +122,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -139,7 +137,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" @@ -155,7 +152,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -171,7 +167,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -187,7 +182,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -203,7 +197,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -219,7 +212,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -235,7 +227,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -251,7 +242,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" @@ -267,7 +257,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -283,7 +272,6 @@ "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" @@ -299,7 +287,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -315,7 +302,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -331,7 +317,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -347,7 +332,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -363,7 +347,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -379,7 +362,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -395,7 +377,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" @@ -411,7 +392,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -427,7 +407,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -443,7 +422,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1460,7 +1438,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -1473,7 +1450,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -1486,7 +1462,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1499,7 +1474,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1512,7 +1486,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1525,7 +1498,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1538,7 +1510,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1551,7 +1522,6 @@ "cpu": [ "ppc64le" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1564,7 +1534,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1577,7 +1546,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1590,7 +1558,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1603,7 +1570,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1616,7 +1582,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1629,7 +1594,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1642,7 +1606,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1652,7 +1615,6 @@ "version": "1.4.11", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.11.tgz", "integrity": "sha512-WKEakMZxkVwRdgMN4AMJ9K5nysY8g8npgQPczmjBeNK5In7QEAZAJwnyccrWwJZU0XjVeHn2uj+XbOKdDW17rg==", - "dev": true, "hasInstallScript": true, "dependencies": { "@swc/counter": "^0.1.2", @@ -1693,7 +1655,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1709,7 +1670,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -1725,7 +1685,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1741,7 +1700,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1757,7 +1715,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1773,7 +1730,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1789,7 +1745,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -1805,7 +1760,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1821,7 +1775,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1837,7 +1790,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -1849,14 +1801,12 @@ "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" }, "node_modules/@swc/types": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.6.tgz", "integrity": "sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==", - "dev": true, "dependencies": { "@swc/counter": "^0.1.3" } @@ -1864,8 +1814,7 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -1877,7 +1826,7 @@ "version": "20.11.30", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", - "dev": true, + "devOptional": true, "dependencies": { "undici-types": "~5.26.4" } @@ -2113,7 +2062,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", - "dev": true, "dependencies": { "@swc/core": "^1.3.107" }, @@ -2232,7 +2180,6 @@ "version": "10.4.19", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2309,7 +2256,6 @@ "version": "4.23.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2358,7 +2304,6 @@ "version": "1.0.30001600", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2495,7 +2440,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, "dependencies": { "is-what": "^3.14.1" }, @@ -2503,6 +2447,11 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/cross": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cross/-/cross-1.0.0.tgz", + "integrity": "sha512-p6hXbCnjuIB4bhKWFeztQd7VwffgQP9zOBzUoiA8Lvi01RzQY0e7PbPFU/uqVPTM2stY7uCpVck1UTPpxhinMQ==" + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2611,8 +2560,7 @@ "node_modules/electron-to-chromium": { "version": "1.4.721", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.721.tgz", - "integrity": "sha512-k1x2r6foI8iJOp+1qTxbbrrWMsOiHkzGBYwYigaq+apO1FSqtn44KTo3Sy69qt7CRr7149zTcsDvH7MUKsOuIQ==", - "dev": true + "integrity": "sha512-k1x2r6foI8iJOp+1qTxbbrrWMsOiHkzGBYwYigaq+apO1FSqtn44KTo3Sy69qt7CRr7149zTcsDvH7MUKsOuIQ==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -2623,7 +2571,6 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, "optional": true, "dependencies": { "prr": "~1.0.1" @@ -2636,7 +2583,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -2674,7 +2620,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, "engines": { "node": ">=6" } @@ -3054,7 +2999,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, "engines": { "node": "*" }, @@ -3190,7 +3134,6 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, "optional": true }, "node_modules/graphemer": { @@ -3253,7 +3196,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -3275,7 +3217,6 @@ "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, "optional": true, "bin": { "image-size": "bin/image-size.js" @@ -3402,8 +3343,7 @@ "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==" }, "node_modules/isexe": { "version": "2.0.0", @@ -3483,7 +3423,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", - "dev": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -3587,7 +3526,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "optional": true, "dependencies": { "pify": "^4.0.1", @@ -3601,7 +3539,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, "optional": true, "engines": { "node": ">=6" @@ -3611,7 +3548,6 @@ "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, "optional": true, "bin": { "semver": "bin/semver" @@ -3641,7 +3577,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, "optional": true, "bin": { "mime": "cli.js" @@ -3715,7 +3650,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.3", @@ -3731,8 +3665,7 @@ "node_modules/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -3746,7 +3679,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3839,7 +3771,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, "engines": { "node": ">= 0.10" } @@ -4130,7 +4061,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, "optional": true }, "node_modules/punycode": { @@ -4399,7 +4329,6 @@ "version": "4.13.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", - "dev": true, "dependencies": { "@types/estree": "1.0.5" }, @@ -4455,14 +4384,12 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, "optional": true }, "node_modules/sax": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "dev": true, "optional": true }, "node_modules/scheduler": { @@ -4531,7 +4458,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "optional": true, "engines": { "node": ">=0.10.0" @@ -4863,7 +4789,6 @@ "version": "5.4.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -4876,13 +4801,12 @@ "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "devOptional": true }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, "funding": [ { "type": "opencollective", @@ -4967,7 +4891,6 @@ "version": "5.2.6", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.6.tgz", "integrity": "sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==", - "dev": true, "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.36", diff --git a/frontend/package.json b/frontend/package.json index f3cca1d..5a3f750 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,11 +19,16 @@ "@radix-ui/react-separator": "^1.0.3", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-tabs": "^1.0.4", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.19", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", "cn-decorator": "^2.1.0", + "cross": "^1.0.0", "i18next": "^23.10.1", + "less": "^4.2.0", "lucide-react": "^0.363.0", + "postcss": "^8.4.38", "react": "^18.2.0", "react-dom": "^18.2.0", "react-hook-form": "^7.51.2", @@ -31,15 +36,11 @@ "react-router": "^6.22.3", "react-router-dom": "^6.22.3", "tailwind-merge": "^2.2.2", + "tailwindcss": "^3.4.3", "tailwindcss-animate": "^1.0.7", - "zod": "^3.22.4", - "vite": "^5.2.0", "typescript": "^5.2.2", - "@vitejs/plugin-react-swc": "^3.5.0", - "less": "^4.2.0", - "postcss": "^8.4.38", - "tailwindcss": "^3.4.3", - "autoprefixer": "^10.4.19" + "vite": "^5.2.0", + "zod": "^3.22.4" }, "devDependencies": { "@types/node": "^20.11.30", diff --git a/frontend/src/components/shared/ui/textarea.tsx b/frontend/src/components/shared/ui/textarea.tsx new file mode 100644 index 0000000..0236ee7 --- /dev/null +++ b/frontend/src/components/shared/ui/textarea.tsx @@ -0,0 +1,24 @@ +import * as React from "react" + +import { cn } from "../../../../lib/utils" + +export interface TextareaProps + extends React.TextareaHTMLAttributes {} + +const Textarea = React.forwardRef( + ({ className, ...props }, ref) => { + return ( + + + + + + + + + ) +} +export default CreateTeam; \ No newline at end of file diff --git a/frontend/src/components/widgets/Header/AuthAPI.ts b/frontend/src/components/widgets/Header/AuthAPI.ts index 293a30c..4752a05 100644 --- a/frontend/src/components/widgets/Header/AuthAPI.ts +++ b/frontend/src/components/widgets/Header/AuthAPI.ts @@ -1,42 +1,67 @@ import { FormEvent } from "react"; +import { API_BASE, API_CREATE_TOKEN, API_REG } from "../../app/APIurl"; - +//логин export const submitLogin = (e: FormEvent) => { e.preventDefault(); const formData = new FormData(e.currentTarget); const formProps = Object.fromEntries(formData); console.log(formProps) + + fetch(`${API_BASE}${API_CREATE_TOKEN}`, { + method: "POST", + headers: { + "Content-Type": "application/json" + }, + body: JSON.stringify(formProps) + }) + .then(response => { + console.log(response.status); + if (response.ok) { + console.log('Создан:', response.headers.get('Location')); + return response.json(); + } else { + throw new Error('Код ошибки: ' + response.status); + } + }) + .then(data => { + console.log('Успешно:', data); + }) + .catch(error => { + console.error('Возникла ошибка с логином4:', error); + }); } + +//регистрация export const submitRegister = (e: FormEvent) => { e.preventDefault(); const formData = new FormData(e.currentTarget); const formProps = Object.fromEntries(formData); - console.log(formProps) - const apiUrl = "http://localhost:8080/api/registration/"; - fetch(apiUrl, { + fetch(`${API_BASE}${API_REG}`, { method: "POST", headers: { "Content-Type": "application/json" }, - body: formData + body: JSON.stringify(formProps) }) .then(response => { - console.log(response.status) - if (response.status === 201) { - console.log('Создан:', response.headers.get('Location')); - } else if (!(response.status === 201)) { - throw new Error('Код ошибки: ' + response.status); + console.log(response.status); + if (response.ok) { + console.log('Создан:', response.headers.get('Location')); + return response.json(); + } else { + throw new Error('Код ошибки: ' + response.status); } - return response.json(); - }) - .then(data => { + }) + .then(data => { console.log('Успешно:', data); - }) - .catch(error => { + }) + .catch(error => { console.error('Возникла ошибка с регой:', error); - }); + }); } + \ No newline at end of file diff --git a/frontend/src/components/widgets/Header/AuthForm.tsx b/frontend/src/components/widgets/Header/AuthForm.tsx index 371a1b2..aa0c4e8 100644 --- a/frontend/src/components/widgets/Header/AuthForm.tsx +++ b/frontend/src/components/widgets/Header/AuthForm.tsx @@ -21,7 +21,7 @@ const AuthForm = () => {
- +
diff --git a/frontend/src/components/widgets/TeamCard/TeamCard.module.less b/frontend/src/components/widgets/TeamCard/TeamCard.module.less new file mode 100644 index 0000000..4c1f9b9 --- /dev/null +++ b/frontend/src/components/widgets/TeamCard/TeamCard.module.less @@ -0,0 +1,39 @@ +@icon-size: 256px; + +.user-icon{ + margin: 20px; + + width: @icon-size; + height: @icon-size; + + border-radius: 0px; + + background-color: #222222; + border: 2px #3c3c3c solid; +} +.username{ + + color: #828282; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-weight: lighter; + font-weight: 200; + font-size: 24px; +} +.card{ + margin: 20px; + padding: 10px; + width: calc(100% - 20px); + +} +.info-line{ + display: flex; +} + +.h1{ + font-size: 36px; +} +.p{ + font-size: 16px; + color: #d3d3d3; +} + diff --git a/frontend/src/components/widgets/TeamCard/TeamCard.tsx b/frontend/src/components/widgets/TeamCard/TeamCard.tsx new file mode 100644 index 0000000..7efae65 --- /dev/null +++ b/frontend/src/components/widgets/TeamCard/TeamCard.tsx @@ -0,0 +1,40 @@ +import { Card } from "../../shared/ui/card"; +import less from "./TeamCard.module.less" +import { Separator } from "../../shared/ui/separator"; +import { Button } from "../../shared/ui/button"; + +const TeamCard = () => { + return( +
+
+
user-icon
+ +
+ + +

Город

Москва

+
+ + +

Город

Москва

+
+ + + + + +

18+

+
+ +
+
+
+ +

Организация

+ + +
+
) +} + +export default TeamCard; \ No newline at end of file