rv82 / ShortLinkDemo

Сервис по сокращению URL

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Задание

  1. Необходимо разработать сервис по сокращению URL
  2. Организовать переход по короткому URL с подсчетом переходов
  3. На главной странице (форме) должен быть размещен список в виде таблицы со следующими столбцами
    • Длинный URL
    • Сокращенный URL
    • Дата создания
    • Кол-во переходов
  4. Реализовать страницу (форму) создания/редактирования элемента, в которой будет использоваться функциональность для сокращения ссылок
  5. Реализовать возможность удаления элемента из списка
  6. Сокращенные URL должны быть такими, чтобы нельзя было угадать (не должны идти по порядку)

Решение

  • Изначально программа создавалась на основе Razor Pages. Но начиная с commit'а e5438a15ade37d709ef3390d494ce792834972c9 было решено перейти на AJAX. Создание, изменение и удаление ссылок производятся во всплывающих окнах. Список ссылок обновляется асинхронно, без перерисовки всей страницы. Вся логика работы со ссылками реализована в контроллере ShortLinkDemo.Controllers.LinkController.
  • На стороне клиента использовал vue.js (азы), для связывания данных с элементами интерфейса.
  • Сделал простейшую валидацию на клиенте и сервере - проверку на то, что поле "Адрес ссылки" непустое. Если в поле ничего не введено, то появляется сообщение об ошибке. Если произойдёт какой-то сбой на сервере, то в верхней части окна также отобразится сообщение. Проблему можно симулировать, просто остановив серверную программу, либо используя отладчик браузера, обнулить значение переменной longUrl в js-функции saveOrUpdateLink (файл Index.cshtml). Более сложную валидацию делать не стал в целях экономии времени.
  • Для даты использовал DateTimeOffset, на случай, если сервис будет использоваться в разных часовых поясах :-)
  • В качестве СУБД использовал SQLite. Подключить любую промышленную СУБД не составит труда.
  • БД создаётся автоматически при запуске приложения. За это отвечает статический метод CreateDbIfNotExists в классе Program. Не проверял, но возможно, при исползовании промышленных СУБД, вызов этого метода придётся убрать.
  • Для решения задачи использовал только одну таблицу для экономии времени и в расчёте на то, что приложение не будет использоваться на практике. Вообще, правильно было бы использовать две таблицы: в одной хранить длинные ссылки, а в другой - окончания коротких ссылок. Это позволило бы избавиться от дублирования, если для одной и той же длинной ссылки создано несколько псевдонимов.

Замечания

  • В целях экономии времени не стал делать локализацию :-)
  • Весь js-код располагается на одной странице. Можно было бы вынести его в отдельный файл и, например, обернуть в объект, чтобы имитировать пространство имён.

Подключение к другим СУБД

Чтобы подключиться к другой СУБД, необходимо (на примере MariaDB/MySQL):

  • Добавить в проект пакет с провайдером БД (например Pomelo.EntityFrameworkCore.MySql).
  • Убрать из проекта пакет Microsoft.EntityFrameworkCore.SQLite.
  • В файл appsettings.json добавить строку подключения к БД (например "Server=localhost;Database=ShortLink;User=root;Password=;")
  • В классе Startup включить настройку:
services.AddDbContext<ShortLinkContext>(options =>
    options.UseSqlite(Configuration.GetConnectionString("ShortLinkContextSQLite")));
  • В классе Program заккоментировать вызов метода CreateDbIfNotExists (можно вообще удалить вместе с определением. Этот метод создавался для простоты работы с SQLite).
  • Средствами СУБД создать базу ShortLink (create database ShortLink).
  • В командной строке выполнить следующие команды (должен быть установлен инструмент dotnet-ef):
    • dotnet ef migrations add Initial
    • dotnet database update
  • Если работа ведётся в VisualStudio, то можно воспользоваться консолью диспетчера пакетов вмето системной консоли (в этом случае наличие инструмента dotnet-ef не обязательно):
    • Add-Migration Initial
    • Update-Database
  • Можно запускать приложение. Должно работать.

About

Сервис по сокращению URL


Languages

Language:C# 63.2%Language:HTML 33.4%Language:CSS 2.9%Language:JavaScript 0.5%