- Необходимо разработать сервис по сокращению URL
- Организовать переход по короткому URL с подсчетом переходов
- На главной странице (форме) должен быть размещен список в виде таблицы со следующими столбцами
- Длинный URL
- Сокращенный URL
- Дата создания
- Кол-во переходов
- Реализовать страницу (форму) создания/редактирования элемента, в которой будет использоваться функциональность для сокращения ссылок
- Реализовать возможность удаления элемента из списка
- Сокращенные 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
- Можно запускать приложение. Должно работать.