gr421_ivgva 1 year ago
commit
26de4082bc

BIN
avatars/banana.jpg


BIN
avatars/banana_2k71fhr.jpg


BIN
avatars/banana_7IYpA4V.jpg


BIN
avatars/banana_KrK7X1b.jpg


BIN
avatars/banana_dwd3eTP.jpg


BIN
avatars/man.jfif


BIN
db.sqlite3


+ 0 - 0
exam/__init__.py


+ 16 - 0
exam/asgi.py

@@ -0,0 +1,16 @@
+"""
+ASGI config for exam project.
+
+It exposes the ASGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "exam.settings")
+
+application = get_asgi_application()

+ 129 - 0
exam/settings.py

@@ -0,0 +1,129 @@
+"""
+Django settings for exam project.
+
+Generated by 'django-admin startproject' using Django 5.0.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/5.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/5.0/ref/settings/
+"""
+
+from pathlib import Path
+
+# Build paths inside the project like this: BASE_DIR / 'subdir'.
+BASE_DIR = Path(__file__).resolve().parent.parent
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = "django-insecure-yi_*5z*-te5(_c@81v!t@*n*$bk%&gj(n2zu)kg-ng+#s@@4b#"
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+    "django.contrib.admin",
+    "django.contrib.auth",
+    "django.contrib.contenttypes",
+    "django.contrib.sessions",
+    "django.contrib.messages",
+    "django.contrib.staticfiles",
+    'main.apps.MainConfig',
+    'bootstrap4',
+]
+
+MIDDLEWARE = [
+    "django.middleware.security.SecurityMiddleware",
+    "django.contrib.sessions.middleware.SessionMiddleware",
+    "django.middleware.common.CommonMiddleware",
+    "django.middleware.csrf.CsrfViewMiddleware",
+    "django.contrib.auth.middleware.AuthenticationMiddleware",
+    "django.contrib.messages.middleware.MessageMiddleware",
+    "django.middleware.clickjacking.XFrameOptionsMiddleware",
+]
+
+ROOT_URLCONF = "exam.urls"
+
+TEMPLATES = [
+    {
+        "BACKEND": "django.template.backends.django.DjangoTemplates",
+        "DIRS": [],
+        "APP_DIRS": True,
+        "OPTIONS": {
+            "context_processors": [
+                "django.template.context_processors.debug",
+                "django.template.context_processors.request",
+                "django.contrib.auth.context_processors.auth",
+                "django.contrib.messages.context_processors.messages",
+            ],
+        },
+    },
+]
+
+WSGI_APPLICATION = "exam.wsgi.application"
+
+
+# Database
+# https://docs.djangoproject.com/en/5.0/ref/settings/#databases
+
+DATABASES = {
+    "default": {
+        "ENGINE": "django.db.backends.sqlite3",
+        "NAME": BASE_DIR / "db.sqlite3",
+    }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+    {
+        "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
+    },
+    {
+        "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
+    },
+    {
+        "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
+    },
+    {
+        "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
+    },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/5.0/topics/i18n/
+
+LANGUAGE_CODE = "ru-ru"
+
+TIME_ZONE = "Asia/Tomsk"
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/5.0/howto/static-files/
+
+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"
+
+AUTH_USER_MODEL = "main.AdvUser"
+
+LOGIN_REDIRECT_URL = '/'

+ 23 - 0
exam/urls.py

@@ -0,0 +1,23 @@
+"""
+URL configuration for exam project.
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+    https://docs.djangoproject.com/en/5.0/topics/http/urls/
+Examples:
+Function views
+    1. Add an import:  from my_app import views
+    2. Add a URL to urlpatterns:  path('', views.home, name='home')
+Class-based views
+    1. Add an import:  from other_app.views import Home
+    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
+Including another URLconf
+    1. Import the include() function: from django.urls import include, path
+    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
+"""
+from django.contrib import admin
+from django.urls import path, include
+
+urlpatterns = [
+    path("admin/", admin.site.urls),
+    path('', include('main.urls'))
+]

+ 16 - 0
exam/wsgi.py

@@ -0,0 +1,16 @@
+"""
+WSGI config for exam project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "exam.settings")
+
+application = get_wsgi_application()

+ 0 - 0
main/__init__.py


+ 5 - 0
main/admin.py

@@ -0,0 +1,5 @@
+from django.contrib import admin
+from .models import AdvUser, Service
+
+admin.site.register(AdvUser)
+admin.site.register(Service)

+ 6 - 0
main/apps.py

@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class MainConfig(AppConfig):
+    default_auto_field = "django.db.models.BigAutoField"
+    name = "main"

+ 13 - 0
main/forms.py

@@ -0,0 +1,13 @@
+from django.contrib.auth.forms import UserCreationForm
+from .models import AdvUser
+from django import forms
+class UserRegisterForm(UserCreationForm):
+    class Meta:
+        model = AdvUser
+        fields = ('username', 'password1', 'password2', 'avatar')
+
+class SearchForm(forms.Form):
+    search_query = forms.CharField(max_length=100, required=False, label='Поиск')
+
+
+

+ 174 - 0
main/migrations/0001_initial.py

@@ -0,0 +1,174 @@
+# Generated by Django 4.2.8 on 2023-12-26 03:15
+
+from django.conf import settings
+import django.contrib.auth.models
+import django.contrib.auth.validators
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+    initial = True
+
+    dependencies = [
+        ("auth", "0012_alter_user_first_name_max_length"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="AdvUser",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("password", models.CharField(max_length=128, verbose_name="password")),
+                (
+                    "last_login",
+                    models.DateTimeField(
+                        blank=True, null=True, verbose_name="last login"
+                    ),
+                ),
+                (
+                    "is_superuser",
+                    models.BooleanField(
+                        default=False,
+                        help_text="Designates that this user has all permissions without explicitly assigning them.",
+                        verbose_name="superuser status",
+                    ),
+                ),
+                (
+                    "username",
+                    models.CharField(
+                        error_messages={
+                            "unique": "A user with that username already exists."
+                        },
+                        help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
+                        max_length=150,
+                        unique=True,
+                        validators=[
+                            django.contrib.auth.validators.UnicodeUsernameValidator()
+                        ],
+                        verbose_name="username",
+                    ),
+                ),
+                (
+                    "first_name",
+                    models.CharField(
+                        blank=True, max_length=150, verbose_name="first name"
+                    ),
+                ),
+                (
+                    "last_name",
+                    models.CharField(
+                        blank=True, max_length=150, verbose_name="last name"
+                    ),
+                ),
+                (
+                    "email",
+                    models.EmailField(
+                        blank=True, max_length=254, verbose_name="email address"
+                    ),
+                ),
+                (
+                    "is_staff",
+                    models.BooleanField(
+                        default=False,
+                        help_text="Designates whether the user can log into this admin site.",
+                        verbose_name="staff status",
+                    ),
+                ),
+                (
+                    "is_active",
+                    models.BooleanField(
+                        default=True,
+                        help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
+                        verbose_name="active",
+                    ),
+                ),
+                (
+                    "date_joined",
+                    models.DateTimeField(
+                        default=django.utils.timezone.now, verbose_name="date joined"
+                    ),
+                ),
+                (
+                    "avatar",
+                    models.ImageField(
+                        default=None,
+                        upload_to="avatars/",
+                        verbose_name="Изображение профиля",
+                    ),
+                ),
+                (
+                    "groups",
+                    models.ManyToManyField(
+                        blank=True,
+                        help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
+                        related_name="user_set",
+                        related_query_name="user",
+                        to="auth.group",
+                        verbose_name="groups",
+                    ),
+                ),
+                (
+                    "user_permissions",
+                    models.ManyToManyField(
+                        blank=True,
+                        help_text="Specific permissions for this user.",
+                        related_name="user_set",
+                        related_query_name="user",
+                        to="auth.permission",
+                        verbose_name="user permissions",
+                    ),
+                ),
+            ],
+            options={
+                "verbose_name": "user",
+                "verbose_name_plural": "users",
+                "abstract": False,
+            },
+            managers=[
+                ("objects", django.contrib.auth.models.UserManager()),
+            ],
+        ),
+        migrations.CreateModel(
+            name="Service",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "name",
+                    models.CharField(max_length=50, verbose_name="Название товара"),
+                ),
+                (
+                    "description",
+                    models.TextField(max_length=300, verbose_name="Описание товара"),
+                ),
+                (
+                    "photo",
+                    models.ImageField(upload_to="photo/", verbose_name="Фото товара"),
+                ),
+                (
+                    "customer",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to=settings.AUTH_USER_MODEL,
+                    ),
+                ),
+            ],
+        ),
+    ]

+ 0 - 0
main/migrations/__init__.py


+ 20 - 0
main/models.py

@@ -0,0 +1,20 @@
+from django.contrib.auth.models import AbstractUser
+from django.db import models
+
+class AdvUser(AbstractUser):
+    avatar = models.ImageField(upload_to='avatars/', verbose_name='Изображение профиля', default=None)
+
+    class Meta(AbstractUser.Meta):
+        pass
+
+    def __str__(self):
+        return self.username
+
+class Service(models.Model):
+    name = models.CharField(max_length=50, verbose_name='Название товара')
+    description = models.TextField(max_length=300, verbose_name='Описание товара')
+    photo = models.ImageField(upload_to='photo/', verbose_name='Фото товара')
+    customer = models.ForeignKey(AdvUser, on_delete=models.CASCADE)
+
+    def __str__(self):
+        return self.name

+ 62 - 0
main/templates/layout/basic.html

@@ -0,0 +1,62 @@
+{% load static %}
+
+<head>
+    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
+    <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-Fy6S3B9q64WdZWQUiU+q4/2Lc9npb8tCaSX9FK7E8HnRr0Jz8D6OP9dO5Vg3Q9ct" crossorigin="anonymous"></script>
+</head>
+<body>
+{% if user.is_authenticated %}
+<nav class="navbar navbar-expand-lg navbar-light bg-light">
+  <a class="navbar-brand" href="{% url 'index' %}">Компания</a>
+
+    <ul class="navbar-nav mr-auto">
+      <li class="nav-item">
+        <a class="nav-link" href="{% url 'index' %}">Главная <span class="sr-only">(current)</span></a>
+      </li>
+      <li class="nav-item">
+        <a class="nav-link" href="{% url 'service' %}">Все товары</a>
+      </li>
+      <li class="nav-item">
+        <a class="nav-link" href="{% url 'profile' %}">Профиль</a>
+      </li>
+      <li class="nav-item">
+        <a class="nav-link" href="{% url 'logout' %}">Выйти</a>
+      </li>
+    </ul>
+
+  <form method="get">
+    {{ search_form.as_p }}
+    <button type="submit" class="btn btn-info">Поиск</button>
+  </form>
+</nav>
+{% else %}
+
+<nav class="navbar navbar-expand-lg navbar-light bg-light">
+  <a class="navbar-brand" href="{% url 'index' %}">Компания</a>
+
+    <ul class="navbar-nav mr-auto">
+      <li class="nav-item">
+        <a class="nav-link" href="{% url 'index' %}">Главная <span class="sr-only">(current)</span></a>
+      </li>
+      <li class="nav-item">
+        <a class="nav-link" href="{% url 'service' %}">Все товары</a>
+      </li>
+      <li class="nav-item">
+        <a class="nav-link" href="{% url 'profile' %}">Профиль</a>
+      </li>
+      <li class="nav-item">
+        <a class="nav-link" href="{% url 'login' %}">Авторизация</a>
+      </li>
+      <li class="nav-item">
+        <a class="nav-link" href="{% url 'register' %}">Регистрация</a>
+      </li>
+    </ul>
+</nav>
+{% endif %}
+{% block content %}
+
+{% endblock %}
+</body>
+
+

+ 35 - 0
main/templates/main/index.html

@@ -0,0 +1,35 @@
+{% extends 'layout/basic.html' %}
+{% block content %}
+{% if services %}
+<div class="container">
+<h1>Добро пожаловать на наш сайт!</h1>
+<h1>Все наши товары:</h1> <br><br>
+</div>
+    {% for service in services %}
+    <div class="container">
+
+        <h2>Название товара: {{service.name}}</h2>
+        <h2>Изображение товара:</h2> <img src="{{service.photo.url}}" width="300px" height="300px"><br><br><br><br>
+    </div>
+    {% endfor %}
+<div class="pagination">
+    <span class="step-links">
+        {% if page_obj.has_previous %}
+            <a href="?page=1">&laquo; first</a>
+            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
+        {% endif %}
+
+        <span class="current">
+            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
+        </span>
+
+        {% if page_obj.has_next %}
+            <a href="?page={{ page_obj.next_page_number }}">next</a>
+            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
+        {% endif %}
+    </span>
+</div>
+{% else %}
+<h1>Добро пожаловать на наш сайт! На данный момент товары отсутствуют :(</h1>
+{% endif %}
+{% endblock %}

+ 13 - 0
main/templates/main/login.html

@@ -0,0 +1,13 @@
+{% extends 'layout/basic.html' %}
+{% block content %}
+{% if user.is_authenticated %}
+    <h2>Вы уже авторизованы!</h2>
+{% else %}
+    <form method="POST">
+        {% csrf_token %}
+        <h2>Форма регистрации</h2><br>
+        {{form.as_p}}
+        <button type="submit" class="btn btn-primary">Авторизоваться</button>
+    </form>
+{% endif %}
+{% endblock %}

+ 24 - 0
main/templates/main/profile.html

@@ -0,0 +1,24 @@
+{% extends 'layout/basic.html' %}
+{% block content %}
+{% if user.is_authenticated %}
+<div class="container">
+    <h2>Профиль пользователя {{user.username}}</h2>
+    {% if user.avatar %}
+        <h2>Фото профиля:</h2> <img src="{{user.avatar.url}}" width="200px" height="200px"> <br><br>
+    {% else %}
+        <h2>Аватар отсутствует</h2>
+    {% endif %}
+    <h1>Ваши товары:
+        {% for service in services %}
+            <h2>Название товара:  <a href="service/{{ service.id }}">{{service.name}}</a></h2>
+            <h2>Изображение товара:</h2> <img src="{{service.photo.url}}" width="300px" height="300px"> <br> <br></h1>
+            <h2>Описание товара: {{service.description}}</h2> <br><br>
+        {% endfor %}
+</div>
+{% else %}
+<div class="container">
+    <h2>Вам необходимо авторизоваться в систему!</h2>
+    <a href="{% url 'login' %}">Нажмите здесь, чтобы авторизоваться.</a>
+</div>
+{% endif %}
+{% endblock %}

+ 13 - 0
main/templates/main/registration.html

@@ -0,0 +1,13 @@
+{% extends 'layout/basic.html' %}
+{% block content %}
+{% if user.is_authenticated %}
+    <h2>Вы уже зарегистрированы!</h2>
+{% else %}
+    <form method="POST" enctype="multipart/form-data">
+        {% csrf_token %}
+        <h2>Форма регистрации</h2>
+        {{form.as_p}}
+        <button type="submit" class="btn btn-primary">Зарегистрироваться</button>
+    </form>
+{% endif %}
+{% endblock %}

+ 0 - 0
main/templates/main/search_result.html


+ 13 - 0
main/templates/main/service.html

@@ -0,0 +1,13 @@
+{% extends 'layout/basic.html' %}
+{% block content %}
+{% if services %}
+    {% for service in services %}
+    <div class="container">
+        <h2>Название товара:  <a href="service/{{ service.id }}">{{service.name}}</a></h2>
+        <h2>Изображение товара:</h2> <img src="{{service.photo.url}}" width="300px" height="300px"> <br> <br>
+    </div>
+    {% endfor %}
+{% else %}
+<h1>Товаров на данный момент нет!</h1>
+{% endif %}
+{% endblock %}

+ 8 - 0
main/templates/main/service_id.html

@@ -0,0 +1,8 @@
+{% extends 'layout/basic.html' %}
+{% block content %}
+    <div class="container">
+        <h2>Название товара:  <a href="service/{{ service.id }}">{{service.name}}</a></h2>
+        <h2>Изображение товара:</h2> <img src="{{service.photo.url}}" width="300px" height="300px"> <br> <br>
+        <h2>Описание товара: {{service.description}}</h2>
+    </div>
+{% endblock %}

+ 3 - 0
main/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 15 - 0
main/urls.py

@@ -0,0 +1,15 @@
+from .views import *
+from django.urls import path
+from django.conf import settings
+from django.conf.urls.static import static
+
+urlpatterns = [
+    path('', ViewIndex.as_view(), name='index'),
+    path('register', RegistrateUser.as_view(), name='register'),
+    path('login', BBLoginView.as_view(), name='login'),
+    path('logout', LogoutView.as_view(), name='logout'),
+    path('service', ViewServices.as_view(), name='service'),
+    path('service/<int:pk>', ServiceDetail.as_view(), name='service_id'),
+    path('search_result', SearchResult.as_view(), name='search_result'),
+    path('profile', Profile.as_view(), name='profile'),
+] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

+ 89 - 0
main/views.py

@@ -0,0 +1,89 @@
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.contrib.auth.views import LoginView, LogoutView
+from django.shortcuts import render
+from django.urls import reverse_lazy
+from django.views.generic import DetailView, ListView, CreateView, TemplateView
+
+from .models import Service
+from .forms import UserRegisterForm, SearchForm
+
+
+class ViewIndex(ListView):
+    model = Service
+    context_object_name = 'services'
+    template_name = 'main/index.html'
+    paginate_by = 5
+
+    def get_queryset(self):
+        queryset = Service.objects.all()
+        search_query = self.request.GET.get('search_query')
+
+        if search_query:
+            queryset = queryset.filter(name__icontains=search_query)
+
+        return queryset
+
+    def get_context_data(self, *, object_list=None, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context['search_form'] = SearchForm(self.request.GET)
+        return context
+
+class BBLoginView(LoginView):
+    template_name = 'main/login.html'
+    success_url = reverse_lazy('index')
+
+class BBLogout(LoginRequiredMixin, LogoutView):
+    template_name = 'main/logout.html'
+    success_url = reverse_lazy('index')
+
+class RegistrateUser(CreateView):
+    success_url = reverse_lazy('index')
+
+    def get(self, request, *args, **kwargs):
+        form = {'form': RegistrateUser()}
+        return render(request, 'main/registration.html', {'form': form})
+
+    def post(self, request, *args, **kwargs):
+        form = UserRegisterForm(request.POST, request.FILES)
+
+        if form.is_valid():
+            form.save()
+            return render(request, 'main/index.html', {'form': form})
+        return render(request, 'main/registration.html', {'form': form})
+
+class ViewServices(ListView):
+    model = Service
+    template_name = 'main/service.html'
+    context_object_name = 'services'
+
+class ServiceDetail(DetailView):
+    model = Service
+    template_name = 'main/service_id.html'
+
+class Profile(ListView):
+    model = Service
+    template_name = 'main/profile.html'
+    context_object_name = 'services'
+    def get_queryset(self):
+       return Service.objects.filter(customer=self.request.user)
+
+
+class SearchResult(DetailView):
+    model = Service
+    context_object_name = 'services'
+    template_name = 'main/index.html'
+    paginate_by = 5
+
+    def get_queryset(self):
+        queryset = Service.objects.all()
+        search_query = self.request.GET.get('search_query')
+
+        if search_query:
+            queryset = queryset.filter(name__icontains=search_query)
+
+        return queryset
+
+    def get_context_data(self, *, object_list=None, **kwargs):
+        context = super().get_context_data(**kwargs)
+        context['search_form'] = SearchForm(self.request.GET)
+        return context

+ 22 - 0
manage.py

@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+"""Django's command-line utility for administrative tasks."""
+import os
+import sys
+
+
+def main():
+    """Run administrative tasks."""
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "exam.settings")
+    try:
+        from django.core.management import execute_from_command_line
+    except ImportError as exc:
+        raise ImportError(
+            "Couldn't import Django. Are you sure it's installed and "
+            "available on your PYTHONPATH environment variable? Did you "
+            "forget to activate a virtual environment?"
+        ) from exc
+    execute_from_command_line(sys.argv)
+
+
+if __name__ == "__main__":
+    main()

BIN
photo/apple.jpg


BIN
photo/banana.jpg


BIN
photo/banana_Ci7IpGV.jpg


BIN
photo/banana_PHpIRM6.jpg