Giter Club home page Giter Club logo

pick.gg's Introduction

pick.gg

Сервис для проведения турниров между стримерами и игроками по игре League of Legends.

ES2015 with Babel (Server/Client), ReactJS, React-router-V4, ExpressJS, Mongoose, JWT-Authentication, Socket.IO, Webpack

С чего начать разработку?

Предварительно почитай это

  1. Клонируем репозиторий
  2. Выполняем npm i
  3. Запускаем npm run dev
  4. ...
  5. PROFIT?

Структура кода

Это корень монорепозитория, клиентское приложение в папке client, серверное в папке server и общий код в common

Как работать? (организационно)

Все задачи и планирование ведем на github. Наверное чтобы понять как тут все устроено лучше взять задачу из этого списка

pick.gg's People

Contributors

close2real avatar danilstoyanov avatar dcversus avatar dependabot[bot] avatar efim1382 avatar ermakoy avatar kot91ivan avatar ovchingus avatar ponyunicorn avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

pick.gg's Issues

список турниров

  • ресурс турнир (бек) GET /tournaments/
  • вывести список турниров (вывод ТОЛЬКО ЗА ОДИН ДЕНЬ!)
  • фильтры турнира (выбор дня и минимум цены за вход)

image

общий рейтинг

страница общего рейтинга

ссылка размещается вверху на панели, видим отранжированный список пользователей системы и занятое ими место. Ранжируем по: сумме мест во всех законченных турнирах.

Карточки пользователей содержат аватар, никнейм и место. Клик ведет на страницу публичного профиля, выводим ВСЕХ пользователей системы

  • базовое описание
  • бекенд
  • макеты
  • фронтенд
  • тестирование

Общий рейтинг пользователей

Необходимо создать общий рейтинг пользователей. Критерий ранжирования - количество заработанных денег, от участия в турнирах.

Back-end:

  • Создать метод для получения рейтинга

Front-end:

  • Вывести данные на страницу с роутом /rating. Для вывода использовать таблицу как в турнирах

обновление панели

  • аватарка с никнеймом (кликабельна!) в которой: выйти из системы, ссылка изменить профиль, ссылка публичный профиль
  • ссылка страницу общего рейтинга
  • ссылка на мои турниры (турниры в которых я принимаю участие)

Caseinsensitive регистр логина

Авторизация на сайте - ввожу логин и пароль.
Сам логин с маленькой буквы, по привычке с большой ввел - пользователь не найден.
То есть логин чувствителен к регистру.

Модели данных

дерево связей модели ТУРНИР

турнир это

  • правила (массив)
  • цена входа
  • название
  • игрок (один! создатель)

имеет отношение к

  • НАСТОЯЩИЙ ТУРНИР
  • участие в турнире

где

участие в турнире это

  • игрок
  • выбранные киберспортсмены (массив)
  • турнир

результаты матча

  • игрок
  • выбранный киберспорстмен
  • массив его результатов в матче (правило: результат)

НАСТОЯЩИЙ ТУРНИР это

  • матчи (массив)
  • дата проведения
  • ссылка
  • описание

матч (СУЩНОСТЬ НАСТОЯЩЕГО ТУРНИРА!)

  • турнир
  • время проведения

правки

  • бесплатный турнир (цена 0)
  • ОТДЕЛИТЬ ТУРНИР И ФЕНТЕЗИ ТУРНИР
  • матчи принадлежат ТУРНИРАМ
  • результаты матча принадлежат МАТЧУ
  • пользователи СОЗДАЮТ ФЕНТЕЗИ ТУРНИРЫ
  • ФЕНТЕЗИ ТУРНИР ссылается на ТУРНИР
  • ТУРНИРЫ ЗАПИСАНЫ ЗАРАНЕЕ https://www.npmjs.com/package/mongoose-data-seed
  • обновление данных на клиенте (update) / BaseService
  • финализация процесса - GET /system/finalize
  • проверяет даты (и если турнир завершен) считает рейтинги, начисляет деньги победителю И
  • ОБЯЗАТЕЛЬНО ОБНОВЛЯЕТ ПОЛЕ СТАТУСА! ЧТОБЫ НЕЛЬЗЯ БЫЛО ДВАЖДЫ ВЫЗВАТЬ!
  • синхронизация турнира - GET /system/sync
  • создает ТУРНИРЫ (случайные) и матчи к ним!

Мобильная версия

  • Лендинг (стартовая страница)
  • Страница логина
  • Страница регистрации
  • Страница турниров (мы туда попадаем после логина)
  • Страница с карточками команды, выбранной на турнир
  • Страница публичный профайл
  • Страница настройки профайла
  • Страница рейтинг пользователей

Мобильная версия

Страница турнира сломалась
image

  • - статус и выигрыш
  • - карточки выбранных игроков
  • - матчи
  • - статус матча

Создать компонент нотификации

В интерфейсе сейчас остро становится вопрос недостатка нотификаций.
Для начала можно использовать компонент нотификации как в Unichat.

участие в турнире

  • создавая турнир, у юзера идет списание баланса (если не хватает баланса - то получает сообщение об ошибке)
  • бекенд страницы "мои турниры" должен работать!
  • заполнение карточкек на странице турнира (интеграция с бекендом) РОВНО ДО ДАТЫ КОГДА ТУРНИР!
  • бекенд, модель матча (время, статус: завершен/не завершен, данные по результату киберспортсмен и баллы)
  • бекенд, у турнира в отношении юзера считаются его выбранные киберспортсмены и сумма всех баллов по результатам матчей)
  • бекенд, рейтинговая таблица пользователей
  • на странице турнира, в списке матчей, рядом с каждым завершенным матчем, считать как матч изменил сумму баллов
  • на странице турнира,
  • если ВСЕ матчи завершены, то показываем что турнир завершен! (выделен победитель - первое занял) и текст после названия турнира - завершено!
  • в списке турниров, если он не начался (текущая дата/день, меньше указанной) то открывается модальное окно "вы точно хотите участвовать ,с вашего баланса будет снято ...", если не хватает денег, то сообщение об ошибке
  • если я посторонний юзер, а ТУРНИР НЕ ЗАВЕРШЕН, то переадресовывает на главную!
  • когда турнир завершается, то на твой счет переводятся деньги (только для первого места) и в журнале запись
  • когда тратишь деньги на участие, у тебя вычитают деньги и в журнале запись
  • обновляется общий рейтинг пользователей!
  • в публичном профиле, ТОЛЬКО ЗАВЕРШЕННЫЕ МАТЧИ!
  • в публичном профиле, "денег заработано" - СУММА ВСЕХ ЗАЧИСЛЕНИЙ ЗА ВСЮ ИСТОРИЮ ЖУРНАЛА! и соответственно, сортируется рейтинг пользователей по ОБЩЕЙ СУММЕ! И МЕСТО В ОБЩЕМ РЕЙТИНГЕ ИДЕТ ОТНОСИТЕЛЬНО ЭТОЙ СУММЕ!
  • в общем рейтинге, столбец - сумма всех заработанных денег
  • на странице турнира, сверху справа - сумма которую получит победитель, считаем перемножая количество игроков на количество денег за вход
  • когда ТУРНИР ИДЕТ И ПОСЛЕ ТОГО КАК ЗАКОНЧИТСЯ - НЕЛЬЗЯ ВЫБИРАТЬ КАРТОЧКИ КИБЕРСПОРТСМЕНОВ

image

страница турнира

  • заготовки карточек
  • базовый ендпоинт турнира (бек)
  • лидерборд
  • детали матчей (расписание)

просто верстка, базовый запрос к ресурсу /tournaments/:id
image

Креативное название списка с правками

Системное

  • У матча есть Время начала и время конца
  • Метод финализации должен ЗАВЕРШИТЬ
  • Задняя картинка на всю высоту, градиент появляется на 95%
  • Dropdown в шапке должен отбрасывать тень (сейчас сливается и см material design)

Авторизация

  • alert при авторизации, должен быть notification
  • Please login in the system - Login

Регистрация

  • сообщения об ошибках!
  • Сообщение об пустом вводе
  • Сразу после регистрации авторизуем и открываем страницу со списком турниров!
  • Please register in the system - register

Страница список турниров

  • фильтр end date - переименовать "date from" и починить
  • фильтр minimal entry - починить

Создание турнира

  • tournament list - высота поля ввода, как у всех! (mac os - -webkit-appearance: none;) + дата слева
  • rules - когда что-то введено, placeholder становится label (https://material.io/design/components/text-fields.html#anatomy label text)
  • в списке турниров, когда entry $0 писать free
  • после создания турнира, я должна видеть страницу с новым турниром!
  • Валидация полей ввода при создании турнира
  • Окно подтверждения при создании турнира
  • Когда создаю турнир, с меня должны списаться деньги как за участника
  • В случае ошибки модальное окно НЕ должно закрываться

Страница турнира

  • добавить match url и сделать матчи кликабельными
  • В leaderboard я ДОЛЖНА видеть себя! и если там есть ТОЛЬКО Я, то добавить подсказку, что ждем новых игроков!
  • Если нет матчей, то мы размещаем заглушку "матчи скоро появятся"
  • Если я выбрала, МЕНЬШЕ 5 чемпионов, то в окне подтверждения ДОБАВИТЬ МОЛ WARNING вы не выбрали 5 чемпионов, точно уверены?
  • Всплывающее модальное окно, должно отбрасывать темную подложку
  • Внешний вид модального окна - https://material.io/design/components/dialogs.html#usage (кнопки действий слева)
  • Winner will get: 0 $ - ПИЗДЕШ! я при создании турнира в него вступила, победитель УЖЕ получит 10 баксов
  • Приняла участие в турнире, себя в списке участников не увидела
  • Статус Status: Will be soon мне врет, турнир вроде как уже в самом разгаре
  • Увеличить отступ от заголовков матчи/лидерборды к содержимому
  • Наведение на профиль выбранного пользователя должен быть НЕ КЛИКАБЕЛЬНЫМ И НЕ ПОДСВЕЧИВАЕМЫМ!

Публичный профиль пользователя

  • Если у пользователя НЕТ архивных турниров, то нужна подсказка "этот пользователь еще не участвовал в турнирах"

Мои турниры

  • My tournaments убрать стрелочку
  • My tournaments пустое состояние

Изменить профиль

  • Смена пароля - временно скрыть плашку!
  • Поле ввода username визуально подчеркнуть, что изменять нельзя!
  • На странице изменения профиля УБРАТЬ целиком блок с аватаркой
  • сообщение об успешном обновлении профиля

Страница рейтинга

  • Рейтинг пользователя перед числом добавить $

обновление инфры

  • подробный readme
  • примеры тестов (e2e/unit)
  • .editorconfig
  • второй инстанс для демы

красота

  • прелоадеры
  • обновление в реальном времени
  • полная реактивность интерфейса

Уборка

Стиль кода

  • Сделайте нормальные единые названия компонентов. У вас один camelcase с большой, другой camelcase с маленькой, один просто маленькими. Сделайте что то одно, может как в чате через дефис, я не знаю. pages у вас весь с маленькой буквы, сделайте как там.
    image

  • Я добавил eslint, внутри client делаем npm i, npm run lint и правим все что напоказывал линтер. У вас жестяк в коде. Также читайте советы по стилю кода js https://learn.javascript.ru/coding-style

  • Момент с форматированием разметки и кода, что удобнее читать и понимать где какой блок начинается и заканчивается, это
    image

Или это?
image
Разделяйте вложенные блоки отдельной строкой между ними

  • Уверен что это Данил делает) Зачем ты везде ставишь лишнюю строку в начале и в конце функций?
    image

  • Когда передаете булевой пропс в компонент, если он true, то само true писать не надо. Хватит просто autofocus
    image

  • this.method.bind(this) не надо делать если используете стрелочную функцию
    image

  • Это какое то извращенство)
    image

js

  • https://github.com/uz0/pick.gg/blob/master/client/src/pages/tournament/index.js#L25
    есть this.props.match.params где будет нужный id. Не надо тут самому разбирать url

  • let для изменяемых переменных. Если не будете менять, ставьте const
    image

  • Это вообще какой то жестяк) такое описывается внутри render через метод map. Если надо прям 5 раз перебрать, можно сделать [1, 2, 3, 4, 5].map()
    image

  • всякие вычисления, преобразования выносить в переменную вначале render
    image

  • зачем столько noname дивов? в стилях так и описываете их, .class div div{}?
    image

  • else return бесполезная штука
    image
    Убираем else и просто

if () {
...
}

return;
  • зачем?
    image
    Просто `let areChampionsSelected = this.state.choosedChampions.length > 0;

  • делайте переносы свойств если их много
    image

  • https://github.com/uz0/pick.gg/blob/master/client/src/components/input/index.js#L10 вы уже обернули это дело в label, зачем там htmlFor и id? Оно будет работать и без этого

  • у вас есть Fragment. import React, { Component, Fragment }. Используйте его, <> ломает подсветку в редакторе
    image

Верстка

  • Условно что нибудь багануло, и у пользователя оказалось триллионы денег. Все едет
    ВСЕМ строкам добавляем
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;

Обязательно тем строкам, которые приходят от бэкенда, и даже статичным строкам. Не факт, что потом не придется добавлять перевод строк и переведенные на другой язык строки не будут длинными
image

  • Ширина заголовков не подходит под ширину ячеек таблиц
    image

  • Зачем в таблице турниров сначала идет ссылка, а внутри нее один div? Почему сразу не сделать просто ссылкой?
    image

Думаю пока хватит

баланс

  • сверху справа появляется сумма в долларах при клике, выпадашка с тремя пунктами (история операций, ввести деньги и вывести деньги)
  • (бекенд) счетчик баланса у юзера и отдельная модель история операций
  • страница история операций (список: дата, сумма)
  • кнопка вывести деньги - отнимает 10 долларов и кнопка ввести деньги прибавляет 10 долларов (соотв. бекенд добавляет запись в историю операций итп)

Создание турнира

  • При создании турнира у пользователя списывается сумма входа. Если денег на балансе пользователя недостаточно - показать уведомление о недостаточном балансе.
  • Актуализировать информацию по правилам.

основы тестирования

  • авторизоваться на сервисе через интерфейс, посмотреть во вкладке сеть запрос, повторить через postman
  • зарегестрироваться через интерфейс, повторить через postman
    image

публичный профиль пользователя

публичный профиль
КАК МЫ ПОПАДАЕМ В ПУБЛИЧНЫЙ ПРОФИЛЬ: сама поделится ссылкой, клик по списку из общего рейтинга, в турнире рейтинг кликабелен
-- никнейм
-- аватарка
-- о себе
-- 5 последних турниров в которых принималось участие (НЕ КЛИКАБЕЛЬНЫ!)
--- название турнира
--- число участников
--- цена входа
--- занятое место в рейтинге
-- общий рейтинг
--- общее число турниров в которых принято участие
--- количество заработанных денег
--- место в общем рейтинге

Доработки по вёрстке

Ссылка на актуальные макеты:
https://www.figma.com/file/eMvfwh75uaxFdTPcR4ciZlhN/Untitled?node-id=114%3A0

В целом всё топ, но есть пару правок, которые следует сделать.
1)Размеры лейблов должны быть 20px согласно макетам, вместо 14px
_1

2)Подпись также 20px
_2

3)У кнопки font-weight должен быть 700(bold) вместо 400
_3

4)При ховере возникает наложение нативных контроллов и иконка календаря. При наведении что-то из этого нужно скрывать.
_4

5)Нужно поработать с расстояниями в попапе. Также, у полей COST плейсхолдер имеет желтый цвет
_5

  1. Этот компонент ещё не закончен? Ширина должна зависеть от результата.
    _6

7)Нужно исправить на Matches
_7

  1. Проблемы с вертикальным выравниваем (отсутпы сверху чуть больше чем снизу)
    _8

  2. Буквы кнопки должны быть в верхнем регистре
    _9

  3. Возможно, здесь нужен какой-нибудь transition (можно спросить Поляшу на этот счёт)
    _10

минорные правки внешнего вида

  • 1. убрать стрелку при наведении в списках турниров

2. Добавить внешний вид для ‘текущий матч’

  • 2.1 Создать стиль для текущего матча
  • 2.2 Узнать условие для отображения текущего матча
    moment(item.date).isBetween(item.date, moment(item.date).add(1, 'h'))
  • 2.3 Добавить условие текущего матча
  • 2.4 Добавить условие finish матча
  • 2.5 Проверить работоспособность текущего матча
  • 2.6 Проверить finish match

3. Когда турнир идёт или завершен (и нельзя выбрать карточку), убрать изменение внешнего вида (и измерение курсора) при наведении

  • 3.1 Создать класс no_active
  • 3.2 Добавить новый класс :hover в цикл добавления карточек

мои турниры

страница мои турниры

АНАЛОГИЧНА общему списку турниров, нету кнопки создать турнир, нету фильтров
Ссылка размещается на верхней панели, видны только ОТКРЫТЫЕ турниры

  • базовое описание
  • бекенд
  • макеты
  • фронтенд
  • тестирование

изменить профиль

Возможно модальное окно, в котором мы можем обновить данные, открывается по клику из мено в панели:

  • никнейм (НЕЛЬЗЯ ИЗМЕНИТЬ! ПРОСТО ПОЛЕ БЕЗ ОБНОВЛЕНИЯ)
  • аватарка (можно сбросить, можно загрузить новую)
  • смена пароля (введите старый пароль, введите новый, повторите новый и кнопка изменить пароль)
  • почта (простое поле ввода)
  • о себе (расширенное поле ввода)

статус

  • бекенд
  • макеты
  • фронтенд
  • тестирование

Задачи по доработке турниров

Back-end:

  • Завершенный турнир должен содержать поле с информацией о юзере-победителе.
  • Реализовать перевод денег юзеру, если он стал победителем турнира.
  • Запрещать юзеру участие в турнире, если турнир завершен либо идёт прямо сейчас.
  • У турнира в отношении юзера считаются его выбранные киберспортсмены и сумма всех баллов по результатам матчей)
  • На странице турнира, в списке матчей, рядом с каждым завершенным матчем, считать как матч изменил сумму баллов

Front-end:

  • При клике на кнопку участия в турнире, показывать попап с уведомлением о списании денежных средств
  • Считать, как каждый матч изменил сумму балов
  • Если ВСЕ матчи завершены, то показываем что турнир завершен! (выделен победитель - первое занял) и текст после названия турнира - завершено

Рефакторинг названий CSS классов

Благодаря mad skills Романа, у нас в проекте появились CSS модули.
Главная фича, которую дают нам CSS модули - это инкапсуляция стилей в рамках одного компонента с целью избегания негативных эффектов глобального CSS.

Мы хотим избежать лишних переопределений стилей в коде.
(Советую прочесть https://habr.com/ru/company/mailru/blog/319956/ чтобы лучше понять историю развития подходов работы с CSS и понять что модули делают под капотом)

Сейчас в проекте у нас встречаются такие стили:
image

Это стили для компонента newTournament. В данном случае, нам необязательно начинать каждое css правило с newTournament, т.к. наши стили будут изолированы от глобальной области видимости в компоненте newTournament.

По аналогии, желательно везде избавиться от подобных определений.

Также. В рамках данного проекта, согласно контракту который мы все разработали, для именования стилей мы используем не Camel Case а дефис - или _
пример:
https://github.com/dcversus/uni-chat/blob/master/src/components/dropdown/style.css

Принять участие в турнире

  • кликая на плюсик в карточке, открывается список игроков, с возможностью выбора
  • ендпоинт /tournaments/:id/setup
  • Получить игроков, с которыми юзер зарегался на турнир
    image

Возможность получить список моих турниров

Бекенд:

  • Доработка модели турнира или юзера
  • Создание ендпоинта для получения списка турниров, в которых юзер принимал участие

Фронтенд:

  • Страница "Мои турниры"
  • Таблица со списком турниров, в которых юзер принимает / принимал участие

очередное остроумное название таски-мусорки

  • фильтр по настоящему турниру
  • информация о самом турнире и условия (с ссылкой на правила)
  • кто создатель (кликабельно)
  • название настоящего турнира
  • правила которые установил пользователь
  • расширенный статус (выбери игроков, жди матчей, следи за результатами)
  • под карточкой выбранного киберспорстмена показывать его личный вклад по балам (аналогично как в матчах)
  • авторизация через facebook / google
  • С САМЫМ НИЗКИМ ПРИОРИТЕТОМ i18n
  • создала турнир, сразу открывается модалка с выбором киберспортсменов
  • добавить в попап выбора игроков

то чего не хватает

  • выбрать основной сценарий кастомки/модерируемо
  • загнать реальной даты
  • может сменить игру?
  • понятные истории/очевиднее прописать детали? обучение? подсказки? текст?
  • правила и лендос, сделать черновики/к пункту выше
  • обновления и уведомления в реальном времени

Пустота в меню превью

Пустынно выглядит фентази лига, добавить бы чего. Я просто забыл, что там было до этого, может картинку
image

Создание модели матча

  • модель матча (время, статус: завершен/не завершен, данные по результату киберспортсмен и баллы)

Необходимо уточнить, откуда брать информацию о матчах, как сделать привязку матча к определенному турниру

заготовка лендинга

  • форма авторизации
  • ендпоинт регистрации (переделать addUser / бек) POST /register
  • форма регистрации
  • Заголовок/подзаголовок и кнопка регистрации (и под ней меньше авторизации)
    image
    image
    image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.