Разработать веб-ресурс для анкетирования пользователей на Python/C#

40 руб. за проект
07 мая 2024, 13:46 • 14 откликов • 95 просмотров
Нефункциональные требования:

Требование к архитектуре программы: База данных +Backend + Frontend, связанные через API. Желательно использование паттернов архитектуры кода
Требования к качеству кода: Можно всё не отлаживать, только работоспособность основных функций
Требования к тестированию: Минимальное покрытие основных функций + Фикстуры
Требование к логированию: Логирование основных пользовательских функций и автоматических функций
Требования к дизайну: Не предъявляются
Требование к языку программирования: Python/C#
Требование к развёртыванию: Docker + Github

Функциональные требования:
Пользователи:
Администратор (1 шт)
Пользователи (1 запись в сущности «Муниципалитет» = соответствующий пользователь). Пользователи могут просматривать сущности «Анкетирования», назначенные только на них самих.

Вкладка «Анкеты»:
Доступна Администратору.
  1. GET: Отображается коллекция (список) анкет, отсортированные по дате изменения (сначала новые). Визуальное представление элемента списка анкет: Наименование, Дата создания, иконка-заглушка блокнота (не принципиально), Кнопка «Удалить» в виде корзины, Кнопка «Выбрать получателей» в виде бумажного самолётика(не принципиально), Кнопка «Копировать», Кнопка «Отчет». После списка анкет должна находиться кнопка для создания новой анкеты.
  2. 2.DELETE: Кнопка «Удалить»: Устанавливает атрибут «Удалено» = «Да», если нет экземпляра «Анкетирования» связанного с текущей анкетой, где атрибут «Пройдена»= «Нет», иначе всплывающее сообщение: «Текущая анкета сейчас находится в работе у пользователей. Верните её на доработку во вкладке «Текущие анкетирования»».
  3. 3.POST: Кнопка «Создать анкету»: Открывает форму для создания анкеты:
    • 3.1. Поле для ввода наименования анкеты.
    • 3.2. Вертикальный список сущностей «Критерий» блоков-контейнеров, которым можно:
      • 3.2.1.Задать наименование,
      • 3.2.2.изменить порядок (переместить выше/ниже),
      • 3.2.3.создать новый,
      • 3.2.4.удалить.
        • 3.2.4.1.При создании/изменении порядка/удалении «Критерия» изменяется атрибут «Порядок» в соответствии с позицией, на которой он расположен на визуальной форме. (Можно добавить визуализацию этого атрибута как приписку перед наименованием, например, «Критерий А», «Критерий Б».. «Критерий Я» (ограничении в 33 элемента) ).
      • 3.2.5.Внутри блока-контейнера «Критерий» можно создавать сущности «Показатель» (вопрос): Вертикальный список сущностей «Показатель», которым можно:
        • 3.2.5.1.Задать наименование (написать саму формулировку вопроса),
        • 3.2.5.2.изменить порядок (переместить выше/ниже),
        • 3.2.5.3.создать новый,
        • 3.2.5.4.удалить,
          • 3.2.5.4.1.При создании/изменении порядка/удалении «Показателя» изменяется атрибут «Порядок» в соответствии с позицией, на которой он расположен на визуальной форме. (Можно добавить визуализацию этого атрибута как приписку перед наименованием, например, «Показатель 1», «Показатель 2»)
        • Задать пояснение-подсказку для вопроса (просто текст)
        • Установить Единицы измерения по справочнику для вопроса (было бы удобно, если бы можно было добавлять элементы в справочник прямо из этой формы).
        • Скрыть вопрос для пользователя, проходящего анкету (Не будет отображаться Не Администраторам)
        • Если вопрос не скрыт, ему можно указать Способ заполнения по справочнику.
        • Указать формулу оценивания для ответа пользователя, проходящего анкету на основе маски(regex выражения) (=(<Порядок Критерия><Порядок вопроса>|<Вещественное число>) (<Математический знак [+-*\]> (<Порядок Критерия><Порядок вопроса>|<Вещественное число>))*) Например: =А1*2 или = Б12/Г6*3,12+Д5). После ввода формулы необходимо проверять корректность заполнения и наличие таких критериев и показателей в анкете
    • 3.3. Кнопка «Сохранить»
  4. 4.POST: Кнопка «Копировать»: Открывает форму для создания анкеты (см. п.3), в которой все сущности заполнены так же, что и существующая (но сущности являются новыми экземплярами), для редактирования.
  5. 5.PUT: При двойном нажатии на экземпляр анкеты, он открывается в форме в режиме для редактирования анкеты и всех связанных сущностей.
  6. 6.POST: Кнопка «Выбрать получателей»: Отображает модальное окно, в котором отображается:
    • 6.1. Записи Справочника: «Муниципалитеты» JOIN сущность «Город», сгруппированные по атрибуту «Ссылка на регион». Администратору доступно для выбора несколько записей.
    • 6.2. Поле «Дата начала»
    • 6.3. Поле «Дата окончания»
    • 6.4. Кнопка «Отправить»
      • 6.4.1.После нажатия кнопки «Отправить» создаются сущности «Анкетирование» по каждой выбранной из модального окна записи, где «дата назначения»=Текущей дате, «Ссылка на Муниципалитет»= Выбранная запись города, принадлежащая муниципалитету из справочника, «Муниципалитет»=Строковое наименование муниципалитета (это для отчетностей), «Город»= Выбранная запись города в строковой записи. Созданные записи отображаются на вкладке «Текущие анкетирования».
      • 6.4.2.По каждому созданному «Анкетированию» отправляется уведомление на E-mail, указанному в сущности «Муниципалитет» в атрибуте «E-mail»:
Тема уведомления: Оценка туристической привлекательности города <Город>. Требуется пройти анкетирование. Текст уведомления: Вам поступила анкета <Наименование> от <Дата назначения> по городу <Город> Начало анкетирования: <Дата начала>. Срок окончания анкетирования: <Дата окончания>. Для перехода к анкете нажмите на ссылку <Ссылка на анкету>.

Вкладка «Текущие Анкетирования»:
Доступна Администратору.
  1. GET: Если на экранной форме чекбокс «Пройденные» = Нет, то Отображается коллекция (список) сущностей «Анкетирование», отсортированные по дате начала (сначала новые). Визуальное представление элемента списка анкет: Наименование, Дата назначения, Муниципалитет, Город, иконка-заглушка блокнота (не принципиально), Кнопка «Отозвать», Кнопка «Продлить»
  2. GET: Если на экранной форме чекбокс «Пройденные» = Да, то Отображается коллекция (список) сущностей «Анкетирование», отсортированные по дате прохождения (сначала новые). Визуальное представление элемента списка анкет: Наименование, Дата прохождения, Муниципалитет, Город, Оценка (сумма оценок всех связанных «Ответов»), иконка-заглушка блокнота (не принципиально), Кнопка «Вернуть»
  3. PUT: При нажатии на Кнопку «Продлить» открывается модальное окно, в котором можно установить новую дату окончания анкетирования.
  4. PUT: При нажатии на Кнопку «Вернуть» открывается модальное окно, в котором можно установить новую дату окончания, указать «комментарий». При нажатии на кнопку «Ок» атрибут «Пройдена» устанавливается в «Нет» и
    • 4.1. на -mail, указанному в сущности «Муниципалитет» в атрибуте «E-mail»:
  5. 5.DELETE: При нажатии на кнопку «Отозвать» удаляется экземпляр сущности «Анкетирование» и связанные экземпляры «Ответ», на E-mail, указанному в сущности «Муниципалитет» в атрибуте «E-mail»:
  6. 6.GET: При двойном нажатии на сущность анкетирование открывается форма анкеты: Критерии LEFT JOIN Показатели LEF JOIN Ответы JOIN Единицы измерения
Тема уведомления: Оценка туристической привлекательности города <Город>. Требуется доработать анкету. Текст уведомления: Доработайте анкету <Наименование> от <Дата назначения> по городу <Город> <Комментарий> Срок окончания анкетирования: <Дата окончания>. Для перехода к анкете нажмите на ссылку <Ссылка на анкету>. Тема уведомления: Оценка туристической привлекательности города <Город>. Анкета отозвана Вкладка «Текущие анкетирования»:
Доступна Пользователю (не администратору)
  1. GET: Отображается коллекция (список) сущностей «Анкетирование», отсортированные по дате окончания (сначала большее), где в атрибуте «Ссылка на муниципалитет» указан муниципалитет текущего пользователя, «Пройдена»= «Нет» и «Дата окончания»>Текущая дата. Визуальное представление элемента списка анкетирования: Наименование, Дата окончания, иконка-заглушка блокнота (не принципиально)
  2. GET: При двойном нажатии на анкету открывает форма для заполнения Сущностей «Ответ», связанных с каждым «Показателем» согласно настройке из справочника «Способ заполнения». Кнопка «Сохранить» и Кнопка «Отправить»
    1. 2.1. Кнопка «Сохранить» сохраняет значения в сущности «Ответ»
    2. 2.2. Кнопка «Отравить» сохраняет значения в сущности «Ответ», считает для каждого атрибут «Оценка» согласно «Формуле оценивания» в связанном вопросе (как в ) и устанавливает атрибут «Пройдена» на «Да», «Дата прохождения» на текущую дату
Вкладка «Справочник: Единица измерения»:
Доступна Администратору.
Отображаются записи сущности «Единица измерения» с возможностью создания, удаления. Вкладка «Справочник: Способ заполнения»:
Доступна Администратору.
Отображаются записи сущности «Способ заполнения». По умолчанию должен быть наполнен: Наименование Подсказка Функционал Число Вводится целое положительное число Поле ответ, связанное с вопросом должно заполняться только натуральным числом Дробное число Вводится дробное положительное число Поле ответ, связанное с вопросом должно заполняться только натуральным числом или дробным Нумерованный список Построчно вводится текст, каждый элемент списка с новой строки. Каждая строка присваивает 1 балл Поле ответ, связанное с вопросом должно заполняться строкой с абзацами, при этом каждый абзац должен маркироваться номером в реальном времени системой, в оценку ответа пойдёт кол-во строк списка, например: 1. Музей совр.иск..
2. Музей древностей

=2 балла.

Нумерованный список с маской Используется для заполнения протяжённости улиц для получения значения внутри строк по маске .. «…» -число.. Поле ответ, связанное с вопросом должно заполняться строкой с абзацами, при этом каждый абзац должен маркироваться номером в реальном времени системой, в оценку ответа пойдёт сумма чисел внутри строк списка, находящихся справа от последнего «-» например:

1. ул. «25-ого Октября» - 25.5км
2. ул. «1805ого года» - 5,5



Вкладка «Справочник: Муниципалитеты»:
Доступна Администратору.
Отображаются записи сущности «Муниципалитет» JOIN «Город» JOIN «Регион», сгруппированные по экземплярам «Регион» с возможностью создания, удаления, редактирования сущностей «Регион», «Муниципалитет», «Город».

Отчеты:
1. При нажатии на кнопку «Отчет» сущности «Анкета» формируется на скачивание таблица в формате .xls по каждой сущности «Анкетирование», связанной с текущей «Анкетой»:
1ая строка – дата формирования отчёта
2ая строка – шапка таблицы: 1ый столбец – «Город», последующие – Порядок «Критерия» + «.» +Порядок «Показателя», затем «Оценка» и «Группа»
3ая и последующие строки – сущности «Анкетирование»: 1ый столбец – атрибут «Город», последующие – атрибут «Оценка» связанного «Ответа» на соответствующий «Показатель», Затем сумма этих оценок (через формулу Excel) и высчитываемая группа методом k-means по 5ти группам. Строки отсортированы по столбцу «Группа».

2. При нажатии на кнопку «Отчет» сущности «Анкетирование» формируется на скачивание таблица в формате .xls по текущей сущности «Анкетирование»:
1ая строка – дата формирования отчёта, «Город», «Муниципалитет»
2ая строка – шапка таблицы: 1ый столбец – «№ п/п», 2й столбец «Критерий», 3й – «Показатель», 4й-«Единицы измерения», 5й-«Значение показателей (с перечислением объектов)», 6й-«Период проставления данных», 7й – «Оценка»
3ая и последующие строки : 1ый столбец – атрибут «Порядок» сущности «Критерий», 2й столбец атрибут «Наименование» сущности «Критерий», 3й – атрибут «Наименование» сущности «Показатель», 4й-атрибут «Наименование» сущности «Единицы измерения», 5й-атрибут «Наименование» сущности «Ответ», 6й-атрибут «Подсказка» сущности «Показатель», 7й- атрибут «Оценка» сущности «Ответ». Сгруппированные по столбцу 1 (можно даже объединить ячейки столбцов одинаковых строк в столбце 1 и 2)

Файлы
Отзывы
R50 703ee0d8b3a40bbb6706bcc9632acbb0
Заказчик
В течение месяца сотрудничества с этим исключительным фрилансером я был постоянно поражен его технической компетенцией и преданностью делу.
Его глубокое понимание API позволило ему без труда интегрировать фронтэнд и бэкэнд нашего веб-сервиса, обеспечив плавную маршрутизацию страниц. Использование им ролевой аутентификации обеспечило надежную и гибкую систему управления доступом.
Его опыт в ASP.NET с интеграциями, отчетами в Excel и логированием был бесценным. Кроме того, использование паттернов проектирования и программирования еще больше повысило качество кода, сделав его поддерживаемым и расширяемым.
Фронтэнд, построенный на Angular, продемонстрировал его исключительные навыки. Он реализовал множество функций с помощью скриптов, а также сложные динамические regex-проверки, обеспечив в сервисе невероятную гибкость и мощь.
Особо следует отметить его инициативу по разработке автотестов на фикстурах.
Кроме того, он постоянно демонстрировал впечатляющую скорость и точность в своей работе. Его техническая компетенция, преданность делу и стремление к качеству делают его идеальным кандидатом для любых сложных проектов.
Ещё он за развёртывание и докер шарит, но это не понадобилось)
6 месяцев назад
R50 abd9528571e504305b45e8fc21fcb288
Фрилансер
 
6 месяцев назад