Как сделать тестовый сервер для сайта

Обновлено: 07.07.2024

Cделать сайт TestHub, который позволяет создавать и проходить тесты (с вопросами и ответами). Их могут использовать например, преподаватели для проверки знаний студентов, работодатели для отсеивания кандидатов на вакансию, маркетологи для проведения опросов. Далее мы будем называть того, кто создает тесты, экзаменатором, а того, кто сдает, студентом, это лишь условные названия.

  • Предлагаемые технологии: фреймворк (Symfony 3-4 (сложнее, но интереснее), Yii2, Laravel), MySQL или Postgres, шаблонизатор Twig, ORM Doctrine
  • Время выполнения: все зависит от тебя, но я бы смотрел на 4-6 недель
  • Уровень: очень продвинутый новичок
  • Требуемые знания: PHP, MVC, ООП, HTML/CSS, SQL, основы JS

Для проверки, что сайт работает правильно, мы будем использовать автоматизированное тестирование (у меня есть урок на эту тему).

Так как задача большая, то ты можешь захотеть делать ее по частям. Можно выбрать такой порядок:

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

/ - Главная. Содержит информацию о сервисе, кнопки для входа/регистрации и список из нескольких самых популярных за последний месяц тестов. Для теста выводятся теги (темы), число прошедших и число пробовавших сдать тест.

/tests - Список тестов. Содержит список всех тестов на сайте, с постраничным отображением. Кликнув на тему, можно отобразить только тесты из этой темы (при этом она будет вписана в поле поиска). Есть поле поиска, в которое можно ввести тему или слово из названия теста, для отображения только тестов на эту тему или содержащих слово в названии (можно подумать над тем, чтобы искать не только в названии, но и в описании теста). Поле ввода поддерживает автодополнение названий тем.

/new - Создать тест. Начальная страница для создания теста (эта же страница используется для редактирования тестов). Мы не требуем регистрации для того, чтобы создавать тесты (но регистрация дает возможность смотреть все созданные тесты и результаты их прохождения в личном кабинете). Для создания теста надо указать обязательное название, небязательные теги-темы (работает автодополнение названий тем), необязательное ограничение по времени. Можно добавить предисловие (с возможностью форматирования в wysiwyg редакторе).

Ниже расположен редактор вопросов. Можно добавить любое число вопросов, каждый вопрос может быть одного из нескольких типов:

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

Для вопроса указывается число баллов за ответ на него, варианты ответа.

Вопросы можно переупорядочивать. Так как вопросы большие и таскать их неудобно, можно при попытке перетащить вопрос выводить слева уменьшенный список номеров, на который можно перетащить сам вопрос. Также, можно разрешить редактировать номер вопроса для этой цели.

Один из вопросов находится в режиме редактирования, другие вопросы просто выводятся (с указанием числа баллов и отмеченным правильным ответом). Клик по неактивному вопросу (или по кнопке "редактировать" у него) переводит его в режим редактирования.

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

/register — страница регистрации. Почти на каждой странице есть ссылка на нее. При этом надо сохранять исходный URL, откуда пришел пользователь, и после регистрации, возвращать его на ту же страницу. Также, надо перенести в аккаунт все созданные им анонимно тесты и результаты тестов.

Мы с уважением относимся к приватности, потому для регистрации требуется только логин и пароль (не разрешаем вводить слишком простые вроде 123456). Мы также рекомендуем, но не требуем, указать Email (при этом высылается письмо для подтверждения. Пока адрес не подтвержден, на него не высылаются уведомления) и имя (которое отображается на сайте). Так как пользователи забывчивы, при входе на сайт можно вводить либо email, либо логин.

Также, пользователь может зарегистрироваться через соцсети (первый вход через соцсеть и есть регистрация). Если соцсеть не отдает email пользователя, то показываем окошко или страницу с предложением его ввести (можно отказаться). У одного пользователя может быть несколько аккаунтов соцсетей (а также вход через логин + пароль), это надо предусмотреть в архитектуре БД, но делать склеивание аккаунтов пока не треуется (но можно и сделать если хочется).

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

Стоит предусмотреть защиту от перебора паролей ограничением попыток ввода пароля с одного IP в одну единицу времени.

Также, войти можно через соцсети, при этом первый вход по сути является регистрацией.

Если пользователь забыл пароль, он может ввести email и получить ссылку. Пользователь, у которого нет пароля и который вошел через соцсети, может таким способом задать пароль (если конечно он указал email при регистрации). Пользователь, который не указал email, не может восстановить пароль.

/test/NNN/question - страница вопроса теста. Показывается сколько осталось времени, текущий вопрос и дается возможность ответить на него. Можно возвращаться к предыдущим вопросам. Можно не отвечать на вопрос. Контроль времени должен вестись на сервере, чтобы его нельзя было обойти.

Результаты и списки отображаются в виде таблиц. Таблицы можно сортировать по доступным колонкам и фильтровать с помощью строки поиска.

Таблицу можно экспортировать (скачать) в форматах CSV, XLS, XML, JSON, TXT (просто текстовый список). При этом они будут отсортированы и отфильтрованы так же, как отсортирована таблица на экране (об этом должно выводиться предупреждение).

В меню справа цифры вроде (+2) показывают число новых (с момента последнего просмотра результатов) результатов тестов. Выводятся несколько тестов с наибольшим числом новых результатов.

Должна быть ссылка для выхода из личного кабинета.

/stat/result/NNN — результаты сдачи теста. Выводится список учеников, сдавших тест, дата, число попыток, набранные баллы. По умолчанию сортируется по убыванию даты. Для каждого результата можно просмотреть подробности (список отвеченных/неотвеченных вопросов и потраченное время), аннулировать результаты, дать дополнительные попытки.

Результаты можно фильтровать по имени (выводятся все имена, содержащие введенную строку), числу баллов (выводятся все результаты с равным или выше указанного числа баллов или ниже, если введено число в форме ) или дате (при вводе конструкций вроде 2014-01-01 , > 01.12.2014 ).

Таблицу можно сортировать по дате, имени, числу баллов, числу попыток.

/stat/passed — сданные мной тесты. Выводится список сданных ранее тестов, по умолчанию сортируется по убыанию даты. Для каждого теста можно просмотреть подробности, если преподаватель это разрешил.

Фильтровать можно по названию, дате, числу баллов.

/stat/results — список созданных мной тестов. Отображается список тестов и число новых непросмотренных результатов. По умолчанию список сортируется по числу новых результатов, а далее по дате последней сдачи теста.

Cделать импорт тестов из популярных форматов Moodle XML и Moodle GIFT. Moodle — это популярная open source платформа для создания электронных курсов. Это позволит нам переманить преподавателей, которые уже сделали тесты в этой системе.

Можно дополнительно добавить еще экспорт в PDF.

Печать теста. Преподаватель может захотеть распечатать тест для заполнения ручкой. Стоит сделать тест компактным (бумагу надо экономить). Вывести на странице необходимо название, опичание теста, время на прохождение, максю число баллов, вопросы, варианты, поля для заполнения.

Печать результатов теста (или любой другой таблицы из личного кабинета). Надо скрыть лишние элементы страницы, оставив только таблицу с данными. Постарайся сделать ее компактной, чтобы не тратить бумагу. При этом таблица дложна быть отсортирована и отфильтрована в соответствии с выбранными настройками (об этом должно быть выведено предупреждение).

Сделать возможность редактировать имя, email, менять пароль.

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

Сделать верстку для удобного просмотра сайта на маленьких (мобильных) экранах.

Возможность после прохождения теста запостить результаты в соцсеть.

Подсказки по реализации

Все формы (а также ссылки вроде разлогинивания) должны быть защишены от CSRF токеном.

Старайся максимально использовать возможности фреймворка, а не писать велосипед. Например, формы, гриды, защиту от CSRF, модели, миграции БД.

На странице списка тестов можно использовать jQuery UI Autocomplete для автодополнения тем (а может быть и названий тестов?).

Для поиска тестов достаточно использовать SQL запрос вроде name LIKE '%квантовая%' AND name LIKE '%физика%' , если тестов будет немного, если много (и тебе хочется сделать посложнее), то стоит сделать полнотекстовый поиск или подключить Sphinx.

Реализовать редактор вопросов можно разными способами. Можно попробовать обойтись HTML формой + дополнительными JS-скриптами. Например, для перетаскивания вопросов попробовать jQuery UI Sortable или jQuery UI draggable. Сама информация в вопросах сохраняется в видимых или скрытых полях и отправляется на сервер как обычная форма. Проверку правильности надо сделать как на клиенте, яваскриптом, так и на сервере. Желательно, чтобы описания полей брались из одного источника, а не дублировались.

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

Другой вариант - написать мини-приложение для редактирования вопросов на каком-нибудь JS фреймворке вроде Vue, React, Angular, Knockout итд. С сервером оно может общаться через AJAX API. API желательно документировать в формате вроде Swagger или OpenAPI. Тогда список вопросов будет загружаться и сохраняться на сервер в виде JSON-массива, но я не уверен что это будет проще. Это потребует хороших знаний JS, но даст возможность сделать более мощный редактор.

Поля ввода, которые позволяют вводить форматированный текст, надо реализовать на основе какого-нибудь (желательно нетяжелого) wysiwyg-редактора. Если редактор состоит из кучи мелких файлов, надо изучить докуменатцию и освоить автоматическую их сборку, иначе страница будет грузиться очень медленно. Естественно, HTML который вводится в это поле, может содержать что угодно, потому на сервере надо его очистить от опасных конструкций. Для этого можно использовать мощную библиотеку HTMLPurifier или встроенный в Yii (если он используется) HTML-фильтр.

Как реализовать доступ экзаменатора к тестам и результатам их сдачи без регистрации? Один из вариантов - генерировать для каждого теста специальный код доступа. Его можно встроить в ссылку и выслать ссылку на почту, если она известна. Также, после создания теста можно добавить пользователю куку для доступа к нему с того же компьютера. Что лучше - использовать одну куку для всех созданных тестов, или новую куку на каждый тест - это отдельный вопрос. Опционально можно подумать, как добавить в аккаунт ранее созданные анонимно тесты. Один из вариантов - это предложить пользователю ввести секретную ссылку для подтверждения, что у него есть доступ к тесту.

Раньше у меня была еще такая идея: для переноса созданных анонимно тестов в аккаунт после регистрации можно выдавать каждому гостю сайта уникальный id в куках. Как только он создает или проходит тест, мы создаем анонимного пользователя в таблице и привязываем к нему тест или результаты. Соответственно, когда он зарегистрируется, мы просто добавляем этому анонимному пользователю имя и возможность логиниться на сайт, а все тесты остаются в аккаунте. Таким образом нам удается с одной стороны отказаться от обязательной регистрации, с другой не терять созданные тесты.

Этот подход имеет тот недостаток, что создает путаницу. Ну например, один человек на компьютере создал тест, другой позже завел аккаунт и ему приписался этот тест. Также, непонятно что делать, если человек сначала создал тест анонимно, а потом залогинился. А потом разлогинился. Добавится ли тест в аккаунт? Останется ли доступ к нему после выхода? Такие вещи неочевидны для пользователей, никак не отображаются на сайте и будут их путать.

Отдельная тема — регистрация. Вот какие особенности стоит учесть:

  • у пользователя может быть не указан email (если он вошел через соцсеть или не захотел его указывать)
  • у пользователя может не быть пароля, при этом войти через форму логина невозможно
  • у пользователя может быть несколько аккаунтов соцсетей + вход через пароль (хотя возможности пока такой нет, но предусмотреть это стоит)

Для реализации этого стоит сделать 2 таблицы: пользователи и внешние аккаунты.

Для реализации входа через соцсети надо иметь аккаунт и зарегистрировать там приложение. Если ты не хочешь их заводить, проще всего реализовывать вход через twitter — там вроде ничего кроме email не требуется, в facebook/vk придется подтвердить телефон.

Если соцсеть отдает больше данных, чем нам требуется, стоит сохранить их на будущее (вдруг завтра мы добавим аватарки?).

Не указывай секретные токены и id приложений в коде или конфигах, которые ты выгружаешь в репозиторий.

Многие сервисы сейчас используют протокол OAuth (или OAuth 2) для входа через них, но каждый немного по-своему. Это упрощает жизнь разработчикам. Если соцсеть предоставляет возможность получить email, не забудь его попросить. Есть готовые библиотеки для реализации входа через соцсети, например, SocialConnect/auth, HybridAuth, HWIOAuthBundle, knpuniversity/oauth2-client-bundle. Этот список, конечно, может устареть со временем.

Ссылки на описание API:

Также, есть сервисы вроде ulogin, которые предосталвяют простой вход через соцсети добавлением скрипта на страницу. Не используй их. Во-первых, так ты ничему не научишься, во-вторых, они следят за твоими посетителями (даже если они не логинятся), и подгружают кучу сомнительных ифреймов в страницу (найди какой-нибудь сайт с такой системой и посмотри сам инспектором).

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

Для вывода таблиц с результатами в твоем фреймворке наверняка что-то есть. В Yii есть grid, в Symfony 2 есть какой-нибудь сторонний плагин.

Для работы с XML при экспорте/импорте стоит использовать DOM XML или SimpleXML. При экспорте давай нормальные имена файлам, например Основы физики.txt или Результаты теста Основы физики (c фильтром).xls , а не бессмысленный набор цифр. Сам подумай, удобно ли когда у тебя полная папка файлов типа test_sdas4d423asd.txt?

Разумеется, такой сложный сайт надо покрыть тестами (иначе как проверить что все работает? Вручную прокликивать десятки кнопок и ссылок?). Чтобы помочь тебе, я составил примерный план тестирования. Он большой и сложный, но как иначе научиться тестировать? У тебя же есть голова, подумай как сделать это с минимумом усилий.

Юнит- и интеграционные тесты

Сайт использует внешние сервисы (соцсети). Нехорошо в тестах взаимодействовать с ними без надобности, надо подумать как заменить их (и отправляемые ими данные) заранее заготовленными заглушками.

Пока не сделан. Вот наброски:

Интересно изучить, как сделать, чтобы сайт мог выдержать большой поток посетителей? Тогда надо наполнить базу сущностями, и протестировать его с помощью Apache Benchmark или, что лучше, Siege. Возможно, где-то стоит запрос оптимизировать, где-то кеш добавить.

Я вижу примерно такой вариант:

Синтаксис можно поменять. Должны генерироваться и связываться между собой все указанные сущности в нужном числе.

Источники данных для генератора:

Имена:

Фамилии:

email — можно сгенерировать в fakenamegenerator или как-нибудь самому, из имен например.

Попробуй сделать списки (не знаю, в каком формате — можно txt файл с значениями на отдельных строках, или json) исходных данных и прикрутить генератор. Совсем сильно заморачиваться не надо, главное чтобы мы могли заплнить базу правдоподобными значениями.

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

С помощью технического домена вы сможете:

протестировать нашу услугу хостинга, если вы только что создали аккаунт;

проверить работу перенесенного на наш хостинг или сервер сайта, не перенаправляя свой домен;

разместить какой-либо внутренний проект, для которого не требуется персональное доменное имя в сети Интернет.

Эта серия мануалов покажет вам, как создать и настроить веб-сайт с помощью CSS, языка таблиц стилей, используемого для управления внешним видом сайтов. Вы можете выполнить все мануалы по порядку, чтобы создать тестовый веб-сайт и познакомиться с CSS, или вразброс использовать описанные здесь методы для оптимизации других проектов CSS.


Для работы с CSS вам нужно иметь базовые знания по HTML, стандартному языку разметки, который используется для отображения документов в браузере. Если ранее вы не работали с HTML, рекомендуем предварительно изучить первые десять руководств серии Создание веб-сайта с помощью HTML.

В этом мануале мы рассмотрим структуру нашего будущего сайта и составим план, согласно которому будем работать над сайтом дальше.

Обзор тестового веб-сайта

У сайта будут такие разделы:

  1. Заголовок. Этому элементу сайта посвящен следующий мануал серии.
  2. About Me. О том, как добавить такой раздел, вы можете узнать здесь.
  3. Projects. О создании этого раздела сайта мы поговорим здесь.
  4. Experience. О создании этого раздела речь пойдет в этом мануале.
  5. Education и Skills. Сразу два раздела сайта мы рассмотрим в этом мануале.
  6. Цитата. Об этом разделе поговорим здесь.
  7. Статический футер. Добавить его вы сможете с помощью этого мануала.

Каждый из этих разделов на практике покажет, как применить к HTML элементам свойства CSS, которые вы изучили в первой половине этой серии. То есть оставшаяся часть серии поможет вам воспроизвести каждый из предыдущих мануалов. Если вы только начинаете изучать CSS, мы рекомендуем вам не выбирать размер, цвет и фоновые изображения самостоятельно, а полностью повторить то, что делается в мануале.

В конце этой серии вы найдете пару советов о том, как вы можете экспериментировать со стилем и макетом веб-сайта дальше: как персонализировать контент, создать новый стиль и изменить компоновку вашего сайта.

Заключение

В этом мануале мы определили структуру тестового веб-сайта и план его создания. В следующем руководстве вы узнаете, как создать CSS-правило для стилизации всего тела веб-страницы и почему это правило важно добавить в самом начале.

Ищешь 40 гигов свободного места на своём пк, ставишь сервер в зависимости от системы и всё, no lobby reservation чтоб токкен не прилипать, и по моему даже порты открывать не нужно если ты 1 будешь в локалке.

September

Drake

Участник

yadi.sk

CSS V92 чистый сервер Windows.rar

Grey83

Ленивая и невнимательная жопа

@Drake, ставишь выделенный через steamcmd на своём ПК и тестишь.
Сначала запускаешь клиент и только потом сервер (если делать наоборот, то клиент не стартует).

babka68

Участник

CTe6eJIeK_vRn

Участник

Drake

Участник

Туник

Участник
Рыба клоун

Ищешь 40 гигов свободного места на своём пк, ставишь сервер в зависимости от системы и всё, no lobby reservation чтоб токкен не прилипать, и по моему даже порты открывать не нужно если ты 1 будешь в локалке.

Сергей68

soon🤷‍♂️🤔

CTe6eJIeK_vRn

Участник

Распаковать, запустить update.bat, дождаться загрузки сервера.
Запускать start.bat, стартовые параметры можно указать в этом батнике.
Установлен: metamod, sourcemod, no lobby reservation, локальный веб-сервер, для fastdl (cм. csgo/cfg/server.cfg, csgo/cfg/fastdl.cfg)

P.S. Для активации nosteam, после полной загрузки сервера, переименовать файл bin/steamclient_nosteam.so в bin/steamclient.so, с заменой


Да, забыл упомянуть что есть seDirector (тема на АМ) - оф.сайт
И вот такое: SteamCMD-GUI
Это если с батничками тяжеловато будет :-)

Читайте также: