слайдер из баннеров

remotes/origin/feature/banners-slider-24-06-19
gzbender 7 years ago
parent b9df0c3a53
commit d851d7cc8c
  1. 8
      apps/content/models.py
  2. 3
      apps/course/templates/course/courses.html
  3. 2
      apps/course/views.py
  4. 11
      apps/school/templates/school/summer_school.html
  5. 18
      apps/school/templates/summer/buy.html
  6. 8
      apps/school/templates/summer/online.html
  7. 3
      apps/school/templates/summer/schedule_purchased.html
  8. 3
      apps/school/views.py
  9. 39
      project/templates/blocks/about.html
  10. 10
      project/templates/blocks/banners.html
  11. 15
      project/templates/blocks/buy.html
  12. 37
      project/templates/blocks/counters.html
  13. 12
      project/templates/lilcity/home.html
  14. 3
      project/templates/lilcity/index.html
  15. 4
      project/views.py
  16. 34
      web/src/js/modules/common.js
  17. 39
      web/src/sass/_common.sass

@ -3,6 +3,7 @@ from urllib.parse import urlparse
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.db.models.expressions import RawSQL
from django.urls import reverse_lazy from django.urls import reverse_lazy
from django.utils import timezone from django.utils import timezone
from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.fields import ArrayField
@ -144,6 +145,7 @@ class GalleryImage(models.Model):
class Banner(models.Model): class Banner(models.Model):
PAGE_INDEX = 1 PAGE_INDEX = 1
PAGE_COURSES = 2 PAGE_COURSES = 2
PAGE_SCHOOL = 3
text = models.TextField() text = models.TextField()
button_text = models.CharField(max_length=50) button_text = models.CharField(max_length=50)
@ -164,6 +166,12 @@ class Banner(models.Model):
verbose_name_plural = 'Банеры' verbose_name_plural = 'Банеры'
ordering = ('-created_at',) ordering = ('-created_at',)
@classmethod
def get_for_page(cls, page):
return Banner.objects.filter(use=True, pages__contains=[page]).annotate(
is_main=RawSQL('main_banner @> %s', ([page],))
).order_by('-is_main')
class Contest(models.Model): class Contest(models.Model):
title = models.CharField(max_length=255) title = models.CharField(max_length=255)

@ -4,12 +4,13 @@
{% block ogimage %}http://{{request.META.HTTP_HOST}}{% static 'img/og_courses.jpg' %}{% endblock ogimage %} {% block ogimage %}http://{{request.META.HTTP_HOST}}{% static 'img/og_courses.jpg' %}{% endblock ogimage %}
{% block content %} {% block content %}
{% include "templates/blocks/banners.html" %} {% if not banners|length %}
<div class="main" style="background-image: url({% static 'img/bg-1.jpg' %});"> <div class="main" style="background-image: url({% static 'img/bg-1.jpg' %});">
<div class="main__center center"> <div class="main__center center">
<div class="main__title">Онлайн-курсы LilCity</div> <div class="main__title">Онлайн-курсы LilCity</div>
</div> </div>
</div> </div>
{% endif %}
<div class="section"> <div class="section">
<div class="section__center center"> <div class="section__center center">
<div class="text text_lg"> <div class="text text_lg">

@ -319,7 +319,7 @@ class CoursesView(ListView):
context = super().get_context_data() context = super().get_context_data()
filtered = CourseFilter(self.request.GET) filtered = CourseFilter(self.request.GET)
context.update(filtered.data) context.update(filtered.data)
context['banners'] = Banner.objects.filter(use=True) context['banners'] = Banner.get_for_page(Banner.PAGE_COURSES)
context['course_items'] = Course.shuffle(context.get('course_items')) context['course_items'] = Course.shuffle(context.get('course_items'))
context['ages'] = Course.AGE_CHOICES[1:] context['ages'] = Course.AGE_CHOICES[1:]
age = context.get('age') age = context.get('age')

@ -3,14 +3,15 @@
{% block ogimage %}http://{{request.META.HTTP_HOST}}{% static 'img/og_main.jpg' %}{% endblock %} {% block ogimage %}http://{{request.META.HTTP_HOST}}{% static 'img/og_main.jpg' %}{% endblock %}
{% block content %} {% block content %}
{% if not is_purchased and not prev_school_payments_exists %} {% if not is_purchased and not prev_school_payments_exists %}
{% include "../summer/promo.html" %} {% include "../summer/buy.html" %}
{% include "../summer/about.html" %}
{% include "../summer/advantages.html" %}
{% include "../summer/online.html" %}
{% include "../blocks/schedule.html" %} {% include "../blocks/schedule.html" %}
{% include "templates/blocks/game.html" %} {% include "../summer/advantages.html" %}
{% include "../summer/about.html" %}
{% include "templates/blocks/partners.html" %} {% include "templates/blocks/partners.html" %}
{% else %} {% else %}
{% include 'templates/blocks/messages.html' %}
{% include "../summer/online.html" %}
{% include "../summer/schedule_purchased.html" %} {% include "../summer/schedule_purchased.html" %}
{% include "templates/blocks/partners.html" %}
{% endif %} {% endif %}
{% endblock %} {% endblock %}

@ -0,0 +1,18 @@
<div class="section" style="padding-bottom: 0px;">
<div class="section__center center text-center">
<a
{% if not is_purchased_future %}
data-popup=".js-popup-buy"
{% endif %}
class="main__btn btn"
href="#"
>
{% if not is_purchased and not is_purchased_future %}Купить доступ от {{ min_school_price }} руб./месяц{% endif %}
{% if is_purchased_future and not is_purchased %}ваша подписка начинается {{school_purchased_future.date_start}}{% endif %}
{% if is_purchased %}ваша подписка истекает {{ subscription_ends_humanize }}<br/>перейти к оплате{% endif %}
</a>
{% if not is_purchased and not is_purchased_future %}
<a class="main__btn btn btn_stroke-black" href="{% url 'gift-certificates' %}">Подарить другу</a>
{% endif %}
</div>
</div>

@ -1,9 +1,7 @@
{% load static %} {% load static %}
<a class="online" target="_blank" href="https://www.youtube.com/watch?v=PhZ8qQbIej0" style="background-image: url({% static 'img/video-1.jpg' %});"> <a class="online" target="_blank" href="https://www.youtube.com/watch?v=PhZ8qQbIej0">
<div class="online__center center"> <div class="online__center center">
<div class="online__type">ВИДЕОУРОКИ</div> <div class="online__title">Каждый день в 17:00 (мск)</div>
<div class="online__title">В 17.00 (по Мск) </div> <div class="online__text text">Онлайн-школа это ежедневные видео-уроки на разные темы. Уроки хранятся 7 дней.</div>
<div class="online__text text">Каждый день</div>
<div class="online__action"></div>
</div> </div>
</a> </a>

@ -1,7 +1,7 @@
{% load static %} {% load thumbnail %} {% load static %} {% load thumbnail %}
<div class="section" id="schedule"> <div class="section" id="schedule">
<div class="section__center center"> <div class="section__center center">
{% include 'templates/blocks/messages.html' %} <div class="title title_center">Расписание</div>
<div class="casing"> <div class="casing">
<div class="casing__col"> <div class="casing__col">
<div class="casing__subscribe"> <div class="casing__subscribe">
@ -55,4 +55,3 @@
</div> </div>
</div> </div>
</div> </div>
{% include './last_courses.html' %}

@ -14,6 +14,7 @@ from django.utils.timezone import now
from django.views.generic import ListView, UpdateView, TemplateView, DetailView from django.views.generic import ListView, UpdateView, TemplateView, DetailView
from django.conf import settings from django.conf import settings
from apps.content.models import Banner
from apps.course.models import Course from apps.course.models import Course
from apps.payment.models import SchoolPayment, DrawingCampPayment from apps.payment.models import SchoolPayment, DrawingCampPayment
from .models import LiveLesson, SchoolSchedule from .models import LiveLesson, SchoolSchedule
@ -233,7 +234,9 @@ class SchoolView(TemplateView):
school_schedules_dict[0] = school_schedules_dict.get(7) school_schedules_dict[0] = school_schedules_dict.get(7)
for ll in prev_live_lessons: for ll in prev_live_lessons:
ll.school_schedule = school_schedules_dict.get(ll.date.isoweekday()) ll.school_schedule = school_schedules_dict.get(ll.date.isoweekday())
context.update({ context.update({
'banners': Banner.get_for_page(Banner.PAGE_SCHOOL),
'online': online, 'online': online,
'prev_live_lessons': prev_live_lessons, 'prev_live_lessons': prev_live_lessons,
'prev_live_lessons_exists': prev_live_lessons_exists, 'prev_live_lessons_exists': prev_live_lessons_exists,

@ -1,7 +1,5 @@
{% load static %}
{% load ruplural from plural %}
<div class="anchor" id="about"></div> <div class="anchor" id="about"></div>
<div class="section section_school" style="padding-top: 0;"> <div class="section section_school">
<div class="section__center center"> <div class="section__center center">
<div class="text text_lg"> <div class="text text_lg">
<p>Вы житель мегаполиса и&nbsp;у&nbsp;вас нет времени дополнительно развивать своего ребенка? <p>Вы житель мегаполиса и&nbsp;у&nbsp;вас нет времени дополнительно развивать своего ребенка?
@ -12,38 +10,3 @@
</div> </div>
</div> </div>
</div> </div>
<div class="section section_school">
<div class="section__center center">
<div class="text text_only_curve">
<img class="text__curve text__curve_five" src="{% static 'img/curve-2.svg' %}" width="210">
<div class="title">Lil School в цифрах</div>
</div>
<div class="school school_main">
<div class="school__col">
<div class="school__preview">> {{ config.NUMBER_OF_STUDENTS }}</div>
<div class="school__title">{{ config.NUMBER_OF_STUDENTS|ruplural:'ученик,ученика,учеников' }}</div>
<div class="school__text">прошли обучение в&nbsp;Lil&nbsp;School</div>
</div>
<div class="school__col">
<div class="school__preview">{{ works_count }}</div>
<div class="school__title">{{ works_count|ruplural:'работа,работы,работ' }}</div>
<div class="school__text">
создано учениками Lil&nbsp;School.<br>
Большую часть из&nbsp;них легко найти в&nbsp;<a href="{{ config.SERVICE_INSTAGRAM_URL }}">инстаграм</a>
</div>
</div>
<div class="school__col">
<div class="school__preview">{{ config.NUMBER_OF_COUNTRIES }}</div>
<div class="school__title">{{ config.NUMBER_OF_COUNTRIES|ruplural:'страна,страны,стран' }}</div>
<div class="school__text">где живут талантливые ученики Lil&nbsp;School</div>
</div>
<div class="school__col">
<div class="school__preview">{{ config.NUMBER_OF_CITIES }}</div>
<div class="school__title">{{ config.NUMBER_OF_CITIES|ruplural:'город,города,городов' }}</div>
<div class="school__text">со&nbsp;всего мира со&nbsp;счастливыми учениками Lil&nbsp;School</div>
</div>
</div>
<div style="margin: 50px 0; text-align: center;"><a class="btn" href="/faq">Часто задаваемые вопросы</a></div>
</div>
</div>

@ -1,4 +1,12 @@
<swiper class="banners" :options="{effect: 'slide', speed: 700, loop: true, autoplay: {delay: 5000} }"> <swiper class="banners" :options="{
effect: 'slide',
speed: 700,
loop: true,
autoplay: {delay: 5000},
pagination: {
el: '.swiper-pagination',
clickable: true,
}}">
{% for banner in banners %} {% for banner in banners %}
<swiper-slide> <swiper-slide>
<div class="banner" <div class="banner"

@ -0,0 +1,15 @@
{% if True or not is_purchased and not is_purchased_future %}
<div class="section" style="padding-bottom: 0px;">
<div class="section__center center text-center">
<a
data-popup=".js-popup-buy"
class="main__btn btn"
data-is-camp="1"
href="#"
>
купить доступ от {{ camp_price }} руб./месяц
</a>
<a class="main__btn btn btn_stroke-black" href="{% url 'gift-certificates' %}">Подарить другу</a>
</div>
</div>
{% endif %}

@ -0,0 +1,37 @@
{% load static %}
{% load ruplural from plural %}
<div class="section section_school">
<div class="section__center center">
<div class="text text_only_curve">
<img class="text__curve text__curve_five" src="{% static 'img/curve-2.svg' %}" width="210">
<div class="title">Lil School в цифрах</div>
</div>
<div class="school school_main">
<div class="school__col">
<div class="school__preview">> {{ config.NUMBER_OF_STUDENTS }}</div>
<div class="school__title">{{ config.NUMBER_OF_STUDENTS|ruplural:'ученик,ученика,учеников' }}</div>
<div class="school__text">прошли обучение в&nbsp;Lil&nbsp;School</div>
</div>
<div class="school__col">
<div class="school__preview">{{ works_count }}</div>
<div class="school__title">{{ works_count|ruplural:'работа,работы,работ' }}</div>
<div class="school__text">
создано учениками Lil&nbsp;School.<br>
Большую часть из&nbsp;них легко найти в&nbsp;<a href="{{ config.SERVICE_INSTAGRAM_URL }}">инстаграм</a>
</div>
</div>
<div class="school__col">
<div class="school__preview">{{ config.NUMBER_OF_COUNTRIES }}</div>
<div class="school__title">{{ config.NUMBER_OF_COUNTRIES|ruplural:'страна,страны,стран' }}</div>
<div class="school__text">где живут талантливые ученики Lil&nbsp;School</div>
</div>
<div class="school__col">
<div class="school__preview">{{ config.NUMBER_OF_CITIES }}</div>
<div class="school__title">{{ config.NUMBER_OF_CITIES|ruplural:'город,города,городов' }}</div>
<div class="school__text">со&nbsp;всего мира со&nbsp;счастливыми учениками Lil&nbsp;School</div>
</div>
</div>
<div style="margin: 50px 0; text-align: center;"><a class="btn" href="/faq">Часто задаваемые вопросы</a></div>
</div>
</div>

@ -12,17 +12,13 @@
{% block title %}School LIL.CITY{% endblock title %} {% block title %}School LIL.CITY{% endblock title %}
{% block content %} {% block content %}
{% include "templates/blocks/promo.html" %}
{% include "templates/blocks/messages.html" %} {% include "templates/blocks/messages.html" %}
{% include "templates/blocks/arts.html" %} {% include "templates/blocks/buy.html" %}
{% include "templates/blocks/video.html" %}
{% include "templates/blocks/about.html" %} {% include "templates/blocks/about.html" %}
{% include "templates/blocks/gallery.html" %} {% include "templates/blocks/video.html" %}
{% include "templates/blocks/mobile_apps.html" %} {% include "templates/blocks/counters.html" %}
{% include "templates/blocks/online_school.html" %}
{% include "templates/blocks/reviews.html" %} {% include "templates/blocks/reviews.html" %}
{% include "templates/blocks/online_school.html" %}
{% include "templates/blocks/teachers.html" %} {% include "templates/blocks/teachers.html" %}
{% include "templates/blocks/last_courses.html" %}
{% include "templates/blocks/partners.html" %} {% include "templates/blocks/partners.html" %}
{% include "templates/blocks/game.html" %}
{% endblock content %} {% endblock content %}

@ -35,6 +35,9 @@
<div class="outer js-outer"> <div class="outer js-outer">
{% include "templates/blocks/header.html" %} {% include "templates/blocks/header.html" %}
<div id="lilcity-vue-app" class="container"> <div id="lilcity-vue-app" class="container">
{% if banners %}
{% include "templates/blocks/banners.html" %}
{% endif %}
{% block content %}{% endblock content %} {% block content %}{% endblock content %}
</div> </div>
{% include "templates/blocks/footer.html" %} {% include "templates/blocks/footer.html" %}

@ -99,10 +99,8 @@ class IndexView(TemplateView):
review_images = list(map(str, range(1, 107))) review_images = list(map(str, range(1, 107)))
shuffle(review_images) shuffle(review_images)
banners = Banner.objects.filter(use=True)
context.update({ context.update({
'banners': banners, 'banners': Banner.get_for_page(Banner.PAGE_INDEX),
'is_drawing_camp': True, 'is_drawing_camp': True,
'review_images': review_images, 'review_images': review_images,
'gift_certificate': user_gift_certificate.gift_certificate if user_gift_certificate else None, 'gift_certificate': user_gift_certificate.gift_certificate if user_gift_certificate else None,

@ -23,13 +23,6 @@ $(document).ready(function () {
} }
}); });
// Инициируем начальное состояние шапки
/* updateHeader();
$(window).on('scroll', function () {
updateHeader();
}); */
//===========BANNERS=============== //===========BANNERS===============
const $banner = $('[data-banner]'); const $banner = $('[data-banner]');
const bannerId = $banner.data('banner') + ''; const bannerId = $banner.data('banner') + '';
@ -130,30 +123,3 @@ $(document).ready(function () {
$popupAuth.find(authPopupActiveTab == 'login' ? '.js-auth-type_login' : '.js-auth-type_registration').addClass('active'); $popupAuth.find(authPopupActiveTab == 'login' ? '.js-auth-type_login' : '.js-auth-type_registration').addClass('active');
$popupAuth.find(authPopupActiveTab == 'login' ? '.js-auth-tab_login' : '.js-auth-tab_registration').show(); $popupAuth.find(authPopupActiveTab == 'login' ? '.js-auth-tab_login' : '.js-auth-tab_registration').show();
}); });
function updateHeader() {
const scrollOffset = $(window).scrollTop();
const headerElement = $('header');
if (scrollOffset >= 130) {
headerElement.css('background-color', '#fff');
} else {
headerElement.css('background-color', `rgba(255, 255, 255, ${scrollOffset / 130})`);
}
if (scrollOffset >= 150) {
headerElement.addClass('header--shadow');
} else {
headerElement.removeClass('header--shadow');
}
if($('.banner').is(':visible')) {
if(scrollOffset > 0) {
if(scrollOffset <= 140) {
headerElement.css('top', (140-scrollOffset)+'px');
} else {
headerElement.css('top', '0px');
}
} else {
headerElement.css('top', '');
}
}
}

@ -120,6 +120,9 @@ button
&_xs &_xs
max-width: 540px max-width: 540px
.text-center
text-align: center
.btn .btn
position: relative position: relative
padding: 13px 24px 12px padding: 13px 24px 12px
@ -980,11 +983,7 @@ a[name]
&_confirm &_confirm
padding: 30px 0 50px padding: 30px 0 50px
&_school &_school
padding: 85px 0 20px padding-bottom: 0px
+t
padding: 65px 0 55px
+m
padding: 45px 0
&_benefits &_benefits
padding: 95px 0 100px padding: 95px 0 100px
background: $bg background: $bg
@ -1204,26 +1203,17 @@ a[name]
.online .online
display: block display: block
position: relative position: relative
padding: 55px 0 50px padding-top: 55px
background-position: 50% 50% background-position: 50% 50%
background-repeat: no-repeat background-repeat: no-repeat
background-size: cover background-size: cover
color: white color: black
text-align: center text-align: center
z-index: 4 z-index: 4
+t +t
padding: 30px 0 padding-top: 30px
+m +m
padding: 20px 0 padding-top: 20px
&:before
content: ''
position: absolute
top: 0
left: 0
width: 100%
height: 100%
background-image: linear-gradient(-1deg, rgba(0,0,0,0.30) 0%, rgba(0,0,0,0.60) 100%)
z-index: -2
&__type &__type
margin-bottom: 85px margin-bottom: 85px
// +fb // +fb
@ -1236,20 +1226,19 @@ a[name]
+m +m
margin-bottom: 40px margin-bottom: 40px
&__title &__title
margin-bottom: 2px margin-bottom: 20px
// +fb font-size: 35px
font-size: 50px
line-height: (6/5) line-height: (6/5)
+t +t
margin-bottom: 6px margin-bottom: 15px
font-size: 24px font-size: 24px
&__text &__text
max-width: 600px max-width: 600px
+t font-size: 20px
margin-bottom: 65px font-family: 'ProximaNova-Regular', sans-serif
margin-bottom: 0
+m +m
max-width: 80% max-width: 80%
margin-bottom: 40px
&__action &__action
+fb +fb
font-size: 10px font-size: 10px

Loading…
Cancel
Save