From 09e8ceb7da55ad4add98d9fc9e3d3be8265227e5 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Wed, 25 Dec 2024 22:50:10 +0330 Subject: [PATCH 01/20] dockerise for push --- .github/workflows/deploy.yaml | 35 ++++++++++++++++++++++++++++++ backend/account/views.py | 40 +++++++++++++++++++++++++++++------ backend/core/settings.py | 2 +- backend/utils/sms.py | 36 ++++++++++++++++++++++++++++++- docker-compose.yml | 30 ++++++++++++++++---------- frontend/dockerfile | 13 ++++++++++++ 6 files changed, 136 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/deploy.yaml create mode 100644 frontend/dockerfile diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 0000000..6c287c1 --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,35 @@ +name: Deploy to Server + +on: + push: + branches: + - main + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Copy files to server + uses: appleboy/scp-action@v0.1.6 + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SSH_USER }} + password: ${{ secrets.SSH_PASSWORD }} + source: "." + target: "/root/hshop/" + + - name: SSH command to build and start Docker + uses: appleboy/ssh-action@v0.1.6 + with: + host: ${{ secrets.SERVER_HOST }} + username: ${{ secrets.SSH_USER }} + password: ${{ secrets.SSH_PASSWORD }} + script: | + cd /root/hshop/ + docker compose down + docker compose build + docker compose up -d \ No newline at end of file diff --git a/backend/account/views.py b/backend/account/views.py index eeeb285..87dd85d 100644 --- a/backend/account/views.py +++ b/backend/account/views.py @@ -9,6 +9,7 @@ from drf_spectacular.utils import extend_schema, OpenApiParameter from rest_framework_simplejwt.views import TokenObtainPairView from django.shortcuts import get_object_or_404 from rest_framework_simplejwt.tokens import RefreshToken +import ghasedak_sms class SendOTPView(APIView): permission_classes = [AllowAny] @extend_schema( @@ -24,18 +25,43 @@ class SendOTPView(APIView): ) def post(self, request): phone = request.data.get('phone') + if not phone: + return Response({'detail': 'Phone number is required'}, status=status.HTTP_400_BAD_REQUEST) + try: user, created = User.objects.get_or_create(phone=phone) - print(created) - print(user.phone) - otp = user.set_otp() + otp = user.set_otp() message = f"کد یک بار مصرف : {otp}" - print(message) - # send otp - return Response({'detail': 'OTP sent successfully'}, status=status.HTTP_200_OK) + + + sms_api = ghasedak_sms.Ghasedak(api_key="4dc844abd4409fe247ec73831aed2498ad3749c1945660cc252654371756b966vafe5d9LGgMbnfGn") + + # response = sms_api.send_single_sms(ghasedak_sms.SendSingleSmsInput(message=message, receptor=phone, line_number='30005006006908', send_date='', client_reference_id='')) + # print(response) + + + + response = sms_api.send_single_sms( + ghasedak_sms.SendSingleSmsInput( + message=message, + receptor=phone, + line_number='90002930', + send_date='', + client_reference_id='' + ) + ) + + # response = sms_api.send_otp_sms(otp_input) + + if response['statusCode'] == 200: + return Response({'detail': 'OTP sent successfully'}, status=status.HTTP_200_OK) + else: + return Response({'detail': response}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) except User.DoesNotExist: - return Response({'detail': 'User not found'}, status=status.HTTP_404_NOT_FOUND) + return Response({'detail': 'user not found'}, status=status.HTTP_404_NOT_FOUND) + except Exception as e: + return Response({'detail': f'An error occurred: {response}'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) class CustomTokenObtainPairView(TokenObtainPairView): diff --git a/backend/core/settings.py b/backend/core/settings.py index 208fcdd..91d8741 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -27,7 +27,7 @@ EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD") DEFAULT_FROM_EMAIL = os.getenv("SECRET_KEY") SECRET_KEY = os.getenv("SECRET_KEY") -DEBUG = os.getenv("DEBUG") +DEBUG = False # in production lists of allowed hosts and allowed orgins will genrate # in development every host and orgin will be true # in prodcution it will use the postgres info you enterd in .env.local diff --git a/backend/utils/sms.py b/backend/utils/sms.py index e0de4c8..4822747 100644 --- a/backend/utils/sms.py +++ b/backend/utils/sms.py @@ -13,4 +13,38 @@ sms_api = Ghasedak(api_key=os.getenv("SMS_API_KEY")) ### ارسال پیام otp - #response = sms_api.send_otp_sms(receptor='09359****', message='OTP message') \ No newline at end of file + #response = sms_api.send_otp_sms(receptor='09359****', message='OTP message') + + + +import ghasedak_sms + +# Initialize the Ghasedak API client with your API key +sms_api = ghasedak_sms.Ghasedak(api_key="Your_API_KEY") + +# Define the OTP code and the recipient's phone number +otp_code = "123456" # Replace with the generated OTP code +phone_number = "09xxxxxxxxx" # Replace with the recipient's phone number + +# Create the OTP input object +otp_input = ghasedak_sms.SendOtpInput( + send_date=None, # Immediate send; use a specific datetime for scheduled send + receptors=[ + ghasedak_sms.SendOtpReceptorDto( + mobile=phone_number, + # client_reference_id='optional_client_ref_id' # Optional: Add if you have a client reference ID + ) + ], + template_name="YourTemplateName", # Replace with your OTP template name + inputs=[ + ghasedak_sms.SendOtpInput.OtpInput(param="Code", value=otp_code), + # Add more parameters if your template requires them + ], + udh=False # Set to True if you need User Data Header; typically False for standard SMS +) + +# Send the OTP SMS +response = sms_api.send_otp_sms(otp_input) + +# Print the response to check the result +print(response) \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f528766..0aad9e7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,11 +1,13 @@ services: - # frontend: - # build: - # context: ./frontend - # ports: - # - "80:3000" - # depends_on: - # - django + frontend: + build: + context: ./frontend + ports: + - "80:3000" + depends_on: + - django + networks: + - default django: build: @@ -18,22 +20,28 @@ services: - ./backend:/app - media_data:/app/media command: ["sh", "-c", "python manage.py migrate && python manage.py runserver 0.0.0.0:8000"] - + networks: + - default db: image: postgres:16 environment: - POSTGRES_DB: shop_db + POSTGRES_DB: hshop POSTGRES_USER: byeto POSTGRES_PASSWORD: vuhbyq-cypMu0-sirbon volumes: - postgres_data:/var/lib/postgresql/data ports: - - "5434:5432" + - "5434:5432" + networks: + - default + + volumes: postgres_data: media_data: - +networks: + default: \ No newline at end of file diff --git a/frontend/dockerfile b/frontend/dockerfile new file mode 100644 index 0000000..52d9096 --- /dev/null +++ b/frontend/dockerfile @@ -0,0 +1,13 @@ +FROM node:20-alpine as build-stage +WORKDIR /app +COPY package*.json ./ +RUN npm install +COPY . . +RUN npm run build + +FROM node:20-alpine as production-stage +WORKDIR /app +COPY --from=build-stage /app /app +EXPOSE 3000 +ENV NODE_ENV=production +CMD ["npm", "run", "start"] \ No newline at end of file From 28cda9772e0940a26580fdd693f8163128780ec1 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Wed, 25 Dec 2024 23:04:56 +0330 Subject: [PATCH 02/20] update settings --- backend/.env.local | 14 +++++++------- backend/core/settings.py | 1 - 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/backend/.env.local b/backend/.env.local index 9e28739..a122dfd 100644 --- a/backend/.env.local +++ b/backend/.env.local @@ -2,11 +2,11 @@ DEBUG = True # keep debug true to set the database to sqlite # postgres database info -DB_NAME = '' -DB_USER = '' -DB_PASSWORD = '' -DB_HOST = '' -DB_PORT = '' +DB_NAME = 'hshop' +DB_USER = 'byeto' +DB_PASSWORD = 'vuhbyq-cypMu0-sirbon' +DB_HOST = 'db' +DB_PORT = '5434' SECRET_KEY = '2h&gmi54wqauwqht48l-9c)r6_67_(oe_$ll%(+xz%u#)+of@d' # email stuff EMAIL_BACKEND = '' @@ -17,9 +17,9 @@ DEFAULT_FROM_EMAIL = '' # telegram bot toekn TELEGRAM_BOT_TOKEN = '' # domain for allowed host and allowed cors -DOMAIN = '' +DOMAIN = '38.60.202.91' # domain for api (the domain that django will use) -API_DOMAIN = '' +API_DOMAIN = '38.60.202.91' SITE_TITLE = '' SITE_HEADER = '' # jwt token configs diff --git a/backend/core/settings.py b/backend/core/settings.py index 91d8741..6299e53 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -41,7 +41,6 @@ if not DEBUG: ] CORS_ALLOWED_ORIGINS = [f"https://{API_DOMAIN}", f"http://{API_DOMAIN}", f"http://{DOMAIN}", f"https://{DOMAIN}", ] - # database postgres DATABASES = { 'default': { From 6c69204996a181483e5732defa394a9085fa09cf Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Wed, 25 Dec 2024 23:09:03 +0330 Subject: [PATCH 03/20] update port db in .env --- backend/.env.local | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/.env.local b/backend/.env.local index a122dfd..e6e4d43 100644 --- a/backend/.env.local +++ b/backend/.env.local @@ -6,7 +6,7 @@ DB_NAME = 'hshop' DB_USER = 'byeto' DB_PASSWORD = 'vuhbyq-cypMu0-sirbon' DB_HOST = 'db' -DB_PORT = '5434' +DB_PORT = 5434 SECRET_KEY = '2h&gmi54wqauwqht48l-9c)r6_67_(oe_$ll%(+xz%u#)+of@d' # email stuff EMAIL_BACKEND = '' From f0840665cf8486442565321dd7907dd7e37d50a5 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Wed, 25 Dec 2024 23:12:05 +0330 Subject: [PATCH 04/20] update db settings --- backend/core/settings.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/core/settings.py b/backend/core/settings.py index 6299e53..25e8555 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -45,11 +45,11 @@ if not DEBUG: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', - 'NAME': os.getenv("DB_NAME"), - 'USER': os.getenv("DB_USER"), - 'PASSWORD': os.getenv("DB_PASSWORD"), - 'HOST': os.getenv("DB_HOST"), - 'PORT': os.getenv("DB_PORT"), + 'NAME': "hshop", + 'USER': "byeto", + 'PASSWORD': "vuhbyq-cypMu0-sirbon", + 'HOST': 'db', + 'PORT': 5432, } } else: From 1878fe5736542b1f2c264ef2e84daf9288ef5477 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Wed, 25 Dec 2024 23:37:14 +0330 Subject: [PATCH 05/20] send otp in response for test --- backend/account/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/account/views.py b/backend/account/views.py index 87dd85d..b094652 100644 --- a/backend/account/views.py +++ b/backend/account/views.py @@ -56,7 +56,8 @@ class SendOTPView(APIView): if response['statusCode'] == 200: return Response({'detail': 'OTP sent successfully'}, status=status.HTTP_200_OK) else: - return Response({'detail': response}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + print('remmber to remove #TODO') + return Response({'detail': response, 'otp_code': otp}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) except User.DoesNotExist: return Response({'detail': 'user not found'}, status=status.HTTP_404_NOT_FOUND) From a5ef616258ba5df56b742f63ba37142cb3729570 Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Wed, 25 Dec 2024 23:41:58 +0330 Subject: [PATCH 06/20] similate otp succsuess --- backend/account/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/account/views.py b/backend/account/views.py index b094652..ad9ceba 100644 --- a/backend/account/views.py +++ b/backend/account/views.py @@ -57,7 +57,8 @@ class SendOTPView(APIView): return Response({'detail': 'OTP sent successfully'}, status=status.HTTP_200_OK) else: print('remmber to remove #TODO') - return Response({'detail': response, 'otp_code': otp}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + return Response({'detail': f'OTP sent successfully {otp}'}, status=status.HTTP_200_OK) + # return Response({'detail': response, 'otp_code': otp}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) except User.DoesNotExist: return Response({'detail': 'user not found'}, status=status.HTTP_404_NOT_FOUND) From be4fa509843c81855f5ffc118150196c94a7b17b Mon Sep 17 00:00:00 2001 From: Parsa Nazer Date: Thu, 26 Dec 2024 00:04:01 +0330 Subject: [PATCH 07/20] allow all cors --- backend/core/settings.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/core/settings.py b/backend/core/settings.py index 25e8555..75226ed 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -39,8 +39,9 @@ if not DEBUG: f"https://{DOMAIN}", f"http://{DOMAIN}", ] - CORS_ALLOWED_ORIGINS = [f"https://{API_DOMAIN}", f"http://{API_DOMAIN}", - f"http://{DOMAIN}", f"https://{DOMAIN}", ] + # CORS_ALLOWED_ORIGINS = [f"https://{API_DOMAIN}", f"http://{API_DOMAIN}", + # f"http://{DOMAIN}", f"https://{DOMAIN}", ] + CORS_ALLOW_ALL_ORIGINS = True # database postgres DATABASES = { 'default': { From 9f753607a6f1263b7a5749412f35dc15d8b1dd0b Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:50:43 +0330 Subject: [PATCH 08/20] new changes --- frontend/assets/css/tailwind.css | 42 ++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/frontend/assets/css/tailwind.css b/frontend/assets/css/tailwind.css index 9eff1e5..c01171f 100644 --- a/frontend/assets/css/tailwind.css +++ b/frontend/assets/css/tailwind.css @@ -121,12 +121,54 @@ /* ANIMATIONS */ --animate-marquee: marquee 3s linear infinite; + --animate-slide-down: slideDown 300ms ease-out; + --animate-slide-up: slideUp 300ms ease-out; + --animate-overlay-show: overlayShow 150ms ease-in; + --animate-content-show: contentShow 150ms ease-in; @keyframes marquee { to { transform: translateY(-50%); } } + + @keyframes slideDown { + from { + height: 0; + } + to { + height: var(--reka-accordion-content-height); + } + } + + @keyframes slideUp { + from { + height: var(--reka-accordion-content-height); + } + to { + height: 0; + } + } + + @keyframes overlayShow { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + + @keyframes contentShow { + from { + opacity: 0; + transform: translate(-50%, -48%) scale(0.96); + } + to { + opacity: 1; + transform: translate(-50%, -50%) scale(1); + } + } } /* CONTAINER */ From 1bd444ad9eff6ed3f923ba5418537ea56499abc3 Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:50:47 +0330 Subject: [PATCH 09/20] new changes --- .../components/global/ServiceHighlights.vue | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 frontend/components/global/ServiceHighlights.vue diff --git a/frontend/components/global/ServiceHighlights.vue b/frontend/components/global/ServiceHighlights.vue new file mode 100644 index 0000000..7ea8f5b --- /dev/null +++ b/frontend/components/global/ServiceHighlights.vue @@ -0,0 +1,61 @@ + + + + + From 88b20650c46a3c2771efef21b384778b8cbe1922 Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:50:50 +0330 Subject: [PATCH 10/20] new changes --- .../components/global/product/Accordion.vue | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 frontend/components/global/product/Accordion.vue diff --git a/frontend/components/global/product/Accordion.vue b/frontend/components/global/product/Accordion.vue new file mode 100644 index 0000000..3736ce4 --- /dev/null +++ b/frontend/components/global/product/Accordion.vue @@ -0,0 +1,132 @@ + + + + + From 154df23dbb32fd916aabdf11fece7a897d2176e7 Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:50:54 +0330 Subject: [PATCH 11/20] new changes --- frontend/components/global/product-detail/RelatedProducts.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/components/global/product-detail/RelatedProducts.vue b/frontend/components/global/product-detail/RelatedProducts.vue index 728f45e..b587a20 100644 --- a/frontend/components/global/product-detail/RelatedProducts.vue +++ b/frontend/components/global/product-detail/RelatedProducts.vue @@ -25,7 +25,7 @@ const onSwiper = (swiper: SwiperClass) => { From 0126fde3301ccf9bbd8a3c0b365a572d3360fdc2 Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:50:57 +0330 Subject: [PATCH 12/20] new changes --- frontend/components/product/Comments.vue | 29 ------------------------ 1 file changed, 29 deletions(-) delete mode 100644 frontend/components/product/Comments.vue diff --git a/frontend/components/product/Comments.vue b/frontend/components/product/Comments.vue deleted file mode 100644 index 15c2611..0000000 --- a/frontend/components/product/Comments.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - \ No newline at end of file From b360e52eccef9a52747c36a5a8392b26f529edbc Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:51:01 +0330 Subject: [PATCH 13/20] new changes --- .../components/product/ProductComments.vue | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 frontend/components/product/ProductComments.vue diff --git a/frontend/components/product/ProductComments.vue b/frontend/components/product/ProductComments.vue new file mode 100644 index 0000000..15c2611 --- /dev/null +++ b/frontend/components/product/ProductComments.vue @@ -0,0 +1,29 @@ + + + \ No newline at end of file From f2d5203fa5aa669cbba6f108a17f7a7a0ec65ddc Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:51:04 +0330 Subject: [PATCH 14/20] new changes --- .../components/product/ProductDetails.vue | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 frontend/components/product/ProductDetails.vue diff --git a/frontend/components/product/ProductDetails.vue b/frontend/components/product/ProductDetails.vue new file mode 100644 index 0000000..6ba8b56 --- /dev/null +++ b/frontend/components/product/ProductDetails.vue @@ -0,0 +1,38 @@ + + + + + From 0f3b686d988b43b72aaee966ff08c005523fb73e Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:51:07 +0330 Subject: [PATCH 15/20] new changes --- frontend/components/product/ProductVideo.vue | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 frontend/components/product/ProductVideo.vue diff --git a/frontend/components/product/ProductVideo.vue b/frontend/components/product/ProductVideo.vue new file mode 100644 index 0000000..dc7479e --- /dev/null +++ b/frontend/components/product/ProductVideo.vue @@ -0,0 +1,15 @@ + + + From acb5fb4edd29a77f169b23ee9262a825873b035a Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:51:10 +0330 Subject: [PATCH 16/20] new changes --- frontend/components/product/Video.vue | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 frontend/components/product/Video.vue diff --git a/frontend/components/product/Video.vue b/frontend/components/product/Video.vue deleted file mode 100644 index 82f77c4..0000000 --- a/frontend/components/product/Video.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - From 208a91364791440e24d6212318048c8dec70026d Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:51:14 +0330 Subject: [PATCH 17/20] new changes --- frontend/components/products/FilterButton.vue | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 frontend/components/products/FilterButton.vue diff --git a/frontend/components/products/FilterButton.vue b/frontend/components/products/FilterButton.vue new file mode 100644 index 0000000..097aa0f --- /dev/null +++ b/frontend/components/products/FilterButton.vue @@ -0,0 +1,78 @@ + + + + + From 97185d10a8c30598e7979ca24d66485114fdd6ad Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:51:17 +0330 Subject: [PATCH 18/20] new changes --- frontend/layouts/Default.vue | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/layouts/Default.vue b/frontend/layouts/Default.vue index 8a409fe..1e0fa55 100644 --- a/frontend/layouts/Default.vue +++ b/frontend/layouts/Default.vue @@ -11,11 +11,17 @@ From e99b6be81cd84dcf51a599459df6cc04cb2a05f5 Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:51:20 +0330 Subject: [PATCH 19/20] new changes --- frontend/pages/products.vue | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 frontend/pages/products.vue diff --git a/frontend/pages/products.vue b/frontend/pages/products.vue new file mode 100644 index 0000000..e8e68c0 --- /dev/null +++ b/frontend/pages/products.vue @@ -0,0 +1,35 @@ + + + + + From 92c0d241b97b66b560d2a07fa2e059db1e571832 Mon Sep 17 00:00:00 2001 From: Mamalizz Date: Thu, 26 Dec 2024 20:51:23 +0330 Subject: [PATCH 20/20] new changes --- frontend/pages/product/[id].vue | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/frontend/pages/product/[id].vue b/frontend/pages/product/[id].vue index d50937b..056cfac 100644 --- a/frontend/pages/product/[id].vue +++ b/frontend/pages/product/[id].vue @@ -1,8 +1,11 @@