Разработка автоматизированной системы по продвижению музыкальных композиций
Заказать уникальную курсовую работу- 54 54 страницы
- 6 + 6 источников
- Добавлена 26.07.2024
- Содержание
- Часть работы
- Список литературы
ВВЕДЕНИЕ 4
1 РЕАЛИЗАЦИЯ БАЗЫ ДАННЫХ И СЕРВЕРНОЙ ЧАСТИ ИНФОРМАЦИОННОЙ СИСТЕМЫ 5
1.1 Анализ предметной области 5
1.2 Анализ программных средств разработки 7
1.2.1 Описание средств разработки 7
1.2.2 Сравнение баз данных 9
1.3 Выработка требований и ограничений 10
1.4 Проектирование и разработка базы данных 12
1.4.1 Концептуальное проектирование базы данных 12
1.4.2 Логическое проектирование базы данных 13
1.4.3 Физическое проектирование базы данных 14
1.5 Программа реализации проекта базы данных в MS SQL
SERVER 15
1.6 Запросы 18
1.7 Представления 22
1.8 Разработка хранимых процедур 23
1.9 Триггеры 25
2 ПРОЕКТИРОВАНИЕ И РАЗРАБОТКА ПРИЛОЖЕНИЯ 29
2.1 Разработка архитектуры приложения 29
2.2 Разработка структурной схемы приложения 30
2.3 Разработка API-интерфейса приложения 33
2.4 Проектирование интерфейса клиентского приложения 35
2.5 Тестирование API-интерфейса 37
2.6 Тестирование клиентского приложения 41
2.7 Руководство пользователя 43
ЗАКЛЮЧЕНИЕ 46
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ 48
ПРИЛОЖЕНИЯ 49
Приложение А 49
Приложение Б 52
Приложение С 53
В данном разделе описывается процесс тестирования клиентского приложения на основе юнит-тестов и интеграционных тестов. А также приведен код тестирования приложения Django в Приложении С.Регистрация пользователяЦель теста: проверить корректность регистрации нового пользователя через веб-интерфейс.class RegistrationTestCase(TestCase): def test_register_user(self):response = self.client.post(reverse('register'), { 'username': 'testuser', 'email': 'testuser@example.com', 'password1': 'testpassword123', 'password2': 'testpassword123'})self.assertEqual(response.status_code, 302) self.assertTrue(User.objects.filter(username='testuser').exists())Вход пользователяЦель теста: проверить корректность входа зарегистрированного пользователя в систему.class LoginTestCase(TestCase): def setUp(self): self.user = User.objects.create_user(username='bkl', password='mugen') def test_login_user(self): response = self.client.post(reverse('login'), { 'username': 'bkl', 'password': 'mugen' }) self.assertEqual(response.status_code, 302) self.assertTrue('_auth_user_id' in self.client.session)Основные маршрутыЦель теста: проверить доступность основных страниц приложения.class BasicRoutesTestCase(TestCase): def test_index_page(self): response = self.client.get(reverse('index_url')) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Главная') def test_artists_page(self): response = self.client.get(reverse('artists_url')) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Исполнители')Тестирование APIЦель теста: проверить корректность работы API эндпоинтов приложения.class APITestCase(TestCase): def setUp(self): self.client = APIClient() self.artist = Artist.objects.create(name="Beethoven", slug="beethoven") self.genre = Genre.objects.create(name="Классика", slug="classic") track = Track.objects.create(name="Лунная соната", slug="beethoven") track.artists.set([self.artist]) track.genre.set([self.genre]) def test_get_tracks(self): response = self.client.get(reverse('track-list')) self.assertEqual(response.status_code, status.HTTP_200_OK) def test_get_artist(self): response = self.client.get(reverse('artist-detail', kwargs={'artist_id': self.artist.id})) self.assertEqual(response.status_code, status.HTTP_200_OK) def test_get_genres(self): response = self.client.get(reverse('genre-list')) self.assertEqual(response.status_code, status.HTTP_200_OK)Тестирование клиентского приложения позволяет выявить и исправить ошибки в работе веб-интерфейса и API. При прохождении всех тестов успешно можно утверждать, что базовая функциональность приложения работает корректно. В случае обнаружения ошибок необходимо провести дополнительное тестирование и исправление.Эффективное тестирование клиентского приложения с использованием юнит-тестов и интеграционных тестов обеспечивает высокое качество разработки и надежность работы приложения. 2.7 Руководство пользователяРуководство пользователя предназначено для ознакомления с основными функциональными возможностями и правилами использования разработанной информационной системы (ИС) "Автоматизированная система по продвижению музыкальных композиций". Данное руководство поможет пользователям эффективно использовать функции системы для продвижения и прослушивания музыкальных треков.1). Регистрация и вход в системуДля доступа к основным функциям системы необходимо зарегистрироваться и войти в свою учетную запись.Регистрация нового пользователя:на главной странице системы перейдите по ссылке "Регистрация",заполните форму регистрации, введя необходимые данные: логин, адрес электронной почты, пароль,нажмите кнопку "Регистрация",после успешной регистрации будете перенаправлены на страницу входа.Вход в систему:на главной странице системы перейдите по ссылке "Вход",введите свой логин и пароль,нажмите кнопку "Войти",после успешного входа будете перенаправлены на главную страницу системы.2. Основные функции системыСистема предоставляет следующие основные функции для работы с музыкальными композициями:поиск музыкальных треков:используйте поиск по названию композиции на странице "Поиск" для быстрого нахождения трека.просмотр списка исполнителей и жанров:перейдите на страницу "Исполнители", чтобы увидеть список всех доступных исполнителей,перейдите на страницу "Жанры", чтобы просмотреть список всех доступных жанров музыки.просмотр информации об исполнителях и жанрах:на странице исполнителя вы можете узнать подробную информацию о каждом артисте, его популярных треках и изображении,на странице жанра вы можете просмотреть список композиций в выбранном жанре.просмотр детальной информации о музыкальных треках:перейдите на страницу трека, чтобы увидеть его подробную информацию, включая название, исполнителя, жанр, текст песни и возможность скачать трек.Руководство пользователя к информационной системе "Автоматизированная система по продвижению музыкальных композиций" предоставляет основные инструкции для успешного использования всех функциональных возможностей системы. ЗАКЛЮЧЕНИЕВ рамках данной курсовой работы была разработана информационная система "Автоматизированная система по продвижению музыкальных композиций", предназначенная для эффективного управления и продвижения музыкальных треков, артистов и жанров. Работа включала в себя проектирование архитектуры системы, разработку функциональных компонентов, создание API-интерфейса, клиентского приложения и реализацию тестового покрытия.Анализ выполненной работыВ процессе разработки были выполнены следующие ключевые шаги:проектирование структуры и функциональности ИС:была разработана структура базы данных с использованием Django ORM, включая модели для треков, исполнителей и жанров;определены основные функции системы, такие как добавление треков, просмотр списка исполнителей, поиск по трекам и другие.разработка API-интерфейса:созданы контроллеры API для получения данных о треках, исполнителях и жанрах с помощью Django REST Framework;документация API была интегрирована в систему с использованием Swagger для удобства и прозрачности взаимодействия.разработка клиентского приложения:реализовано веб-приложение на базе Django, предоставляющее пользователю удобный интерфейс для взаимодействия с функционалом системы;приложение включает страницы для просмотра треков, исполнителей, жанров, а также возможность регистрации и аутентификации пользователей.тестирование системы:разработаны автоматизированные тесты для проверки работы основных компонентов системы, включая функционал регистрации пользователей, входа в систему, API-запросов и веб-страниц;тесты были выполнены для обеспечения корректности работы системы и выявления потенциальных проблем.Результаты и выводыРазработанная информационная система предоставляет пользователю удобный инструмент для управления музыкальными данными, их продвижения и доступа через API. В дальнейшем возможно расширение функциональности системы путем добавления новых возможностей. Также важным направлением развития является улучшение интерфейса пользователя и оптимизация производительности системы.Разработка информационной системы "Автоматизированная система по продвижению музыкальных композиций" была успешно завершена, достигнуты поставленные цели и обеспечена высокая функциональность. Система готова к использованию и предоставляет широкие возможности для продвижения и управления музыкальным контентом.СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫУорд, Б. Инновации SQL Server 2019 / Б. Уорд ; пер. с англ. Н. Желнова. – СПб. : Питер, 2020. – 408 с. – ISBN 978-5-97060-595-0.Дронов, В. Django 2.1. Практика создания веб-сайтов на Python / В. Дронов. – СПб. : БХВ-Петербург, 2019. – 672 с. – ISBN 978-5-9775-4058-2.Чистый код: создание, анализ и рефакторинг. Библиотека программиста / [пер. с англ.]. – М. : ДМК Пресс, 2024. – 464 с. – ISBN 978-5-4461-0960-9.Документация Django 3.2. [Электронный ресурс]. – Режим доступа: https://docs.djangoproject.com/en/3.2/. Документация Django REST framework. [Электронный ресурс]. – Режим доступа: https://www.django-rest-framework.org/. Документация Python. [Электронный ресурс]. – Режим доступа: https://docs.python.org/3/.Microsoft SQL Server. [Электронный ресурс]. – Режим доступа: ru.wikipedia.org/wiki/Microsoft_SQL_ServerПРИЛОЖЕНИЯПриложение АЛистинг 1 – Создание таблиц БДCREATE TABLE content_type ( id INT IDENTITY(1,1) PRIMARY KEY, app_label NVARCHAR(100) NOT NULL, model NVARCHAR(100) NOT NULL);CREATE TABLE auth_permission ( id INT IDENTITY(1,1) PRIMARY KEY, content_type_id INT NOT NULL, codename NVARCHAR(100) NOT NULL, name NVARCHAR(255) NOT NULL, FOREIGN KEY (content_type_id) REFERENCES content_type(id));CREATE TABLE auth_user ( id INT IDENTITY(1,1) PRIMARY KEY, password NVARCHAR(128) NOT NULL, last_login DATETIME2 NULL, is_superuser BIT NOT NULL, username NVARCHAR(150) NOT NULL UNIQUE, last_name NVARCHAR(150) NOT NULL, email NVARCHAR(254) NOT NULL, is_staff BIT NOT NULL, is_active BIT NOT NULL, date_joined DATETIME2 NOT NULL, first_name NVARCHAR(150) NOT NULL);CREATE TABLE auth_user_user_permissions ( id INT IDENTITY(1,1) PRIMARY KEY, user_id INT NOT NULL, permission_id INT NOT NULL, FOREIGN KEY (user_id) REFERENCES auth_user(id), FOREIGN KEY (permission_id) REFERENCES auth_permission(id));CREATE TABLE main_artist ( id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(70) NOT NULL, image NVARCHAR(100) NOT NULL, date_pub DATETIME2 NOT NULL, views INT NOT NULL, slug NVARCHAR(100) NOT NULL UNIQUE);CREATE TABLE main_genre ( id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(30) NOT NULL, slug NVARCHAR(100) NOT NULL UNIQUE);CREATE TABLE main_track ( id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(70) NOT NULL, audio NVARCHAR(100) NOT NULL, date_pub DATETIME2 NOT NULL, views INT NOT NULL, slug NVARCHAR(100) NOT NULL UNIQUE, lang NVARCHAR(10) NOT NULL, text NVARCHAR(MAX) NOT NULL);CREATE TABLE main_track_artists ( id INT IDENTITY(1,1) PRIMARY KEY, track_id INT NOT NULL, artist_id INT NOT NULL, FOREIGN KEY (track_id) REFERENCES main_track(id), FOREIGN KEY (artist_id) REFERENCES main_artist(id));CREATE TABLE main_track_genre ( id INT IDENTITY(1,1) PRIMARY KEY, track_id INT NOT NULL, genre_id INT NULL, FOREIGN KEY (track_id) REFERENCES main_track(id), FOREIGN KEY (genre_id) REFERENCES main_genre(id));Листинг 2 – Вставка данных в таблицы БД-- Вставка данных в таблицу "content_type"INSERT INTO content_type (app_label, model)VALUES ('auth', 'user'), ('auth', 'permission'), ('main', 'track'), ('main', 'artist'), ('main', 'genre');-- Вставка данных в таблицу "auth_permission"INSERT INTO auth_permission (content_type_id, codename, name)VALUES (1, 'add_user', 'Can add user'),(1, 'change_user', 'Can change user'),(1, 'delete_user', 'Can delete user'),(2, 'add_permission', 'Can add permission');-- Вставка данных в таблицу "auth_user"INSERT INTO auth_user (password, last_login, is_superuser, username, last_name, email, is_staff, is_active, date_joined, first_name)VALUES ('hashed_password_1', NULL, 1, 'superuser', 'Super', 'superuser@example.com', 1, 1, GETDATE(), 'User'),('hashed_password_2', NULL, 0, 'johndoe', 'Doe', 'johndoe@example.com', 1, 1, GETDATE(), 'John');-- Вставка данных в таблицу "main_artist"INSERT INTO main_artist (name, image, date_pub, views, slug)VALUES ('Artist 1', 'artist1.jpg', GETDATE(), 100, 'artist-1'),('Artist 2', 'artist2.jpg', GETDATE(), 200, 'artist-2'),('Artist 3', 'artist3.jpg', GETDATE(), 150, 'artist-3'),('Artist 4', 'artist4.jpg', GETDATE(), 300, 'artist-4');-- Вставка данных в таблицу "main_genre"INSERT INTO main_genre (name, slug)VALUES ('Rock', 'rock'),('Pop', 'pop'),('Electronic', 'electronic');-- Вставка данных в таблицу "main_track"INSERT INTO main_track (name, audio, date_pub, views, slug, lang, text)VALUES ('Track 1', 'track1.mp3', GETDATE(), 100, 'track-1', 'EN', 'Lyrics of track 1'),('Track 2', 'track2.mp3', GETDATE(), 150, 'track-2', 'EN', 'Lyrics of track 2'),('Track 3', 'track3.mp3', GETDATE(), 120, 'track-3', 'EN', 'Lyrics of track 3'),('Track 4', 'track4.mp3', GETDATE(), 180, 'track-4', 'EN', 'Lyrics of track 4');-- Вставка данных в таблицу "main_track_artists"INSERT INTO main_track_artists (track_id, artist_id)VALUES (1, 1), -- Track 1 исполнен Artist 1(2, 2), -- Track 2 исполнен Artist 2(3, 3), -- Track 3 исполнен Artist 3(4, 4), -- Track 4 исполнен Artist 4(1, 2), -- Track 1 также исполнен Artist 2(2, 3), -- Track 2 также исполнен Artist 3(3, 4), -- Track 3 также исполнен Artist 4(4, 1); -- Track 4 также исполнен Artist 1-- Вставка данных в таблицу "main_track_genre"INSERT INTO main_track_genre (track_id, genre_id)VALUES (1, 1), -- Track 1 принадлежит Rock(2, 2), -- Track 2 принадлежит Pop(3, 3), -- Track 3 принадлежит Electronic(4, 1), -- Track 4 принадлежит Rock(1, 2), -- Track 1 также принадлежит Pop(2, 3), -- Track 2 также принадлежит Electronic(3, 1), -- Track 3 также принадлежит Rock(4, 2); -- Track 4 также принадлежит PopЛистинг 3 – Пример работы с созданными таблицами БД-- Удаление процедуры, IF OBJECT_ID('trg_after_track_insert', 'TR') IS NOT NULL DROP TRIGGER trg_after_track_insert;GO-- СозданиеCREATE TRIGGER trg_after_track_insertON main_trackAFTER INSERTASBEGIN-- Объявление переменных для хранения идентификаторов треков и артистов DECLARE @artist_id INT; DECLARE @track_id INT;-- Получение идентификатора артиста из таблицы main_track_artists SELECT @artist_id = artist_id, @track_id = i.id FROM inserted i JOIN main_track_artists ta ON i.id = ta.track_id;-- Увеличение счетчика треков у артиста UPDATE main_artist SET views = views + 1 WHERE id = @artist_id;END;GO-- Добавление нового трекаINSERT INTO main_track (name, audio, date_pub, views, slug, lang, text)VALUES ('New Track', 'new_track.mp3', GETDATE(), 0, 'new-track', 'en', 'Sample lyrics');Приложение БЛистинг 1 – Структура приложения DjangoНа рисунке Б.1 приведен структура проекта:Рисунок Б.1 – Структура Django-проектаПриложение СЛистинг 1 – Настройка и использование SWAGGER# settings.pyINSTALLED_APPS = [ ... 'drf_spectacular', 'drf_spectacular_sidecar', ...]REST_FRAMEWORK = { ... 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', ...}SPECTACULAR_SETTINGS = { 'TITLE': 'Music API', 'DESCRIPTION': 'API для управления треками, артистами и жанрами.', 'VERSION': '1.0.0', 'SERVE_INCLUDE_SCHEMA': False,}# urls.pyfrom drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerViewurlpatterns = [ ... path('api/schema/', SpectacularAPIView.as_view(), name='schema'), path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), ...]Листинг 2 – Тестирование приложения в среде Djangofrom django.test import TestCasefrom django.urls import reversefrom django.contrib.auth.models import Userfrom rest_framework import statusfrom rest_framework.test import APIClientfrom .models import Artist, Genre, Trackclass RegistrationTestCase(TestCase): def test_register_user(self): response = self.client.post(reverse('register'), { 'username': 'testuser', 'email': 'testuser@example.com', 'password1': 'testpassword123', 'password2': 'testpassword123' }) self.assertEqual(response.status_code, 302) # Redirects to another page after registration self.assertTrue(User.objects.filter(username='testuser').exists())class LoginTestCase(TestCase): def setUp(self): self.user = User.objects.create_user(username='bkl', password='mugen') def test_login_user(self): response = self.client.post(reverse('login'), { 'username': 'bkl', 'password': 'mugen' }) self.assertEqual(response.status_code, 302) # Redirects after successful login self.assertTrue('_auth_user_id' in self.client.session)class BasicRoutesTestCase(TestCase): def test_index_page(self): response = self.client.get(reverse('index_url')) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Главная') def test_artists_page(self): response = self.client.get(reverse('artists_url')) self.assertEqual(response.status_code, 200) self.assertContains(response, 'Исполнители')class APITestCase(TestCase): def setUp(self): self.client = APIClient() self.artist = Artist.objects.create(name="Beethoven", slug="beethoven") self.genre = Genre.objects.create(name="Классика", slug="classic") # self.track = Track.objects.create(title="Лунная соната", artist=self.artist, genre=self.genre, slug="beethoven") track = Track.objects.create(name="Лунная соната", slug="beethoven") track.artists.set([self.artist]) # Добавление исполнителя к треку track.genre.set([self.genre]) # Добавление жанра к треку def test_get_tracks(self): response = self.client.get(reverse('track-list')) self.assertEqual(response.status_code, status.HTTP_200_OK) def test_get_artist(self): response = self.client.get(reverse('artist-detail', kwargs={'artist_id': self.artist.id})) self.assertEqual(response.status_code, status.HTTP_200_OK) def test_get_genres(self): response = self.client.get(reverse('genre-list')) self.assertEqual(response.status_code, status.HTTP_200_OK)
1) Уорд, Б. Инновации SQL Server 2019 / Б. Уорд ; пер. с англ. Н. Желнова. – СПб. : Питер, 2020. – 408 с. – ISBN 978-5-97060-595-0.
2) Дронов, В. Django 2.1. Практика создания веб-сайтов на Python / В. Дронов. – СПб. : БХВ-Петербург, 2019. – 672 с. – ISBN 978-5-9775-4058-2.
3) Чистый код: создание, анализ и рефакторинг. Библиотека программиста / [пер. с англ.]. – М. : ДМК Пресс, 2024. – 464 с. – ISBN 978-5-4461-0960-9.
Документация Django 3.2. [Электронный ресурс]. – Режим доступа: https://docs.djangoproject.com/en/3.2/.
4) Документация Django REST framework. [Электронный ресурс]. – Режим доступа: https://www.django-rest-framework.org/.
5) Документация Python. [Электронный ресурс]. – Режим доступа: https://docs.python.org/3/.
6) Microsoft SQL Server. [Электронный ресурс]. – Режим доступа: ru.wikipedia.org/wiki/Microsoft_SQL_Server