Таблица
|
Атрибут
|
Описание
|
artists
|
|
Содержит информацию об
исполнителях альбомов.
|
|
artist_id
|
Уникальный идентификатор исполнителя.
|
|
name
|
Имя исполнителя.
|
albums
|
|
Содержит информацию об альбомах.
|
|
album_id
|
Уникальный идентификатор альбома.
|
|
name
|
Название альбома.
|
|
released
|
Год выпуска альбома.
|
songs
|
|
Содержит информацию о конкретной
песне.
|
|
song_id
|
Уникальный идентификатор песни.
|
|
name
|
Название песни.
|
|
duration
|
Продолжительность песни.
|
users
|
|
Содержит информацию о
зарегистрированных в системе пользователях.
|
|
user_id
|
Уникальный идентификатор
пользователя.
|
|
login
|
Логин пользователя.
|
|
password
|
Пароль пользователя. Хранится в
хешированном виде.
|
Имя пользователя.
|
album_artists
|
|
Содержит информацию об авторах
альбомов. Наличие записи в данной таблице означает, что исполнитель является
автором указанного альбома (связь многие-ко-многим).
|
|
album_id
|
Уникальный идентификатор альбома.
|
|
artist_id
|
Уникальный идентификатор
исполнителя.
|
album_songs
|
|
Содержит информацию о составе
альбома. Наличие записи в данной таблице означает, что песня входит в
указанный альбом (связь многие-ко-многим).
|
|
album_id
|
Уникальный идентификатор альбома.
|
|
song_id
|
Уникальный идентификатор песни.
|
ratings
|
|
Содержит информацию об оценках
пользователей.
|
|
user_id
|
Уникальный идентификатор
пользователя.
|
|
song_id
|
Уникальный идентификатор песни.
|
|
rating
|
Оценка пользователя (от 1 до 5).
|
genre
|
|
Содержит информацию о жанрах
песен.
|
|
genre_id
|
Уникальный идентификатор жанра.
|
|
name
|
Название жанра.
|
genre_songs
|
|
Содержит информацию о составе
жанров. Наличие записи в данной таблице означает, что песня имеет указанный
жанр (связь многие-ко-многим).
|
|
genre_id
|
Уникальный идентификатор жанра.
|
|
song_id
|
Уникальный идентификатор песни.
|
. Архитектура приложения
При написании информационной системы были
использованы следующие технологии:
· MySQL Community Server - свободно
распространяемый сервер баз данных;
· Servlet - Web-сервер, который умеет
работать с сервлетами, запускает Java-машину, которая в свою очередь выполняет
сервлет, а сервлет отдает данные, которые он сформирует.
· Java Server Pages - технология,
позволяющая веб-разработчикам легко создавать содержимое, которое имеет как
статические, так и динамические компоненты. Наша информационная система также
использует библиотеку JSTL, расширяющую спецификацию JSP;
· На уровне представления используются
стандартные технологии: XHTML, CSS, JavaScript.
На рисунке 2 приведена общая архитектура
приложения. Пример Servlet-класса - в приложении Б; JSP-страницы - в приложении
B.
Рисунок 2 - Общая архитектура приложения.
. Интерфейс пользователя
.1 Страница регистрации
Рисунок 3 - Страница регистрации.
.2 Главная страница
Рисунок 4 - Главная страница.
.3 Страница поиска
Рисунок 5 - Страница поиска.
база данные
каталог музыкальный
3.4 Приложение для работы с базами данных
Рисунок 6 - Приложение для работы с БД.
Приложение А
SQL-скрипты создания таблицSCHEMA IF NOT EXISTS
`music` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
--
----------------------------------
- Table `music`.`artists`
-
-----------------------------------------------------TABLE IF NOT EXISTS
`music`.`artists` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(32) NOT NULL ,
PRIMARY KEY (`id`) );
--
-----------------------------------------------------
- Table `music`.`albums`
-
-----------------------------------------------------TABLE IF NOT EXISTS
`music`.`albums` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(32) NOT NULL ,
`released` DATE NOT NULL ,KEY (`id`) );
-
-----------------------------------------------------
- Table `music`.`songs`
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(64) NOT NULL ,
`duration` INT NOT NULL ,KEY (`id`) );
-
-----------------------------------------------------
- Table `music`.`users`
-
-----------------------------------------------------TABLE IF NOT EXISTS
`music`.`users` (
`id` INT NOT NULL AUTO_INCREMENT ,
`login` VARCHAR(16) NOT NULL ,
`password` VARCHAR(32) BINARY NOT NULL ,
`name` VARCHAR(16) NOT NULL ,KEY (`id`) ,INDEX
`login_UNIQUE` (`login` ASC) );
-
-----------------------------------------------------
- Table `music`.`album_artists`
-
-----------------------------------------------------TABLE IF NOT EXISTS
`music`.`album_artists` (
`album` INT NOT NULL ,
`artist` INT NOT NULL ,KEY (`album`, `artist`)
,`fk_album_artists__albums_idx` (`album` ASC) ,`fk_album_artists__artists_idx`
(`artist` ASC) ,`fk_album_artists__albums`KEY (`album` )`music`.`albums` (`id`
)DELETE NO ACTIONUPDATE NO ACTION,`fk_album_artists__artists`KEY (`artist`
)`music`.`artists` (`id` )DELETE NO ACTIONUPDATE NO ACTION);
-
-----------------------------------------------------
- Table `music`.`album_songs`
-
-----------------------------------------------------TABLE IF NOT EXISTS
`music`.`album_songs` (
`album` INT NOT NULL ,
`song` INT NOT NULL ,KEY (`album`, `song`)
,`fk_album_songs__albums_idx` (`album` ASC) ,`fk_album_songs__songs_idx`
(`song` ASC) ,`fk_album_songs__albums`KEY (`album` )`music`.`albums` (`id`
)DELETE NO ACTIONUPDATE NO ACTION,`fk_album_songs__songs`KEY (`song` )`music`.`songs`
(`id` )DELETE NO ACTIONUPDATE NO ACTION);
-
-----------------------------------------------------
- Table `music`.`ratings`
-
-----------------------------------------------------TABLE IF NOT EXISTS
`music`.`ratings` (
`user` INT NOT NULL ,
`song` INT NOT NULL ,
`rating` TINYINT UNSIGNED NOT NULL ,KEY (`user`,
`song`) ,`fk_ratings__users_idx` (`user` ASC) ,`fk_ratings__songs_idx` (`song`
ASC) ,`fk_ratings__users`KEY (`user` )`music`.`users` (`id` )DELETE NO
ACTIONUPDATE NO ACTION,`fk_ratings__songs`
FOREIGN KEY (`song` ) REFERENCES
`music`.`songs` (`id` )DELETE NO ACTIONUPDATE NO ACTION);
-
-----------------------------------------------------
- Table `music`.`genre`
- -----------------------------------------------------TABLE
IF NOT EXISTS `music`.`genre` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(64) NOT NULL ,KEY (`id`) );
-
-----------------------------------------------------
- Table `music`.`genre_songs`
-
-----------------------------------------------------TABLE IF NOT EXISTS `music`.`genre_songs`
(
`genre` INT NOT NULL ,
`song` INT NOT NULL ,KEY (`genre`, `song`)
,`fk_genre_songs__genres_idx` (`genre` ASC) ,`fk_genre_songs__songs_idx`
(`song` ASC) ,`fk_genre_songs__genres`KEY (`genre` )`music`.`genre` (`id`
)DELETE NO ACTIONUPDATE NO ACTION,`fk_genre_songs__songs`KEY (`song`
)`music`.`songs` (`id` )DELETE NO ACTIONUPDATE NO ACTION);
Приложение Б
Пример
Сервлетаjava.io.*;java.util.*;java.sql.*;javax.servlet.*;javax.servlet.http.*;
public class Authentication extends
HttpServlet {ServletConfig config;void init(ServletConfig config)
throws ServletException {.config = config;
}
public void
doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {connection
= null;out = response.getWriter();rs;userName = new
String("");passwrd = new String("");name = new
String("");.setContentType("text/html");{.forName("com.mysql.jdbc.Driver");properties
= new Properties();.setProperty("user",
"root");.setProperty("password",
"123");.setProperty("useUnicode",
"true");.setProperty("characterEncoding",
"utf8");=
DriverManager.getConnection("jdbc:mysql://localhost:3306/music",
properties);
//Заносим данные в базуsql = "select
login,password,name from users";s =
connection.createStatement();.executeQuery(sql);= s.getResultSet();(rs.next())
{= rs.getString("login");= rs.getString("password");=
rs.getString("name");
}.close();.close();
} catch (Exception e)
{.out.println("Exception is ;" + e);
}(userName.equals(request.getParameter("login"))
&& passwrd.equals(request.getParameter("pass")))
{session = request.getSession(true);.setAttribute("name",
name);dispatcher=
config.getServletContext().getRequestDispatcher("/music0.jsp");.forward(request,
response);
} else {.println("You are not an authentic
person");
}
}}
Приложение В
Пример JSP-страницы
<%@page import="java.sql.Date"%>
<%@page
import="java.sql.Statement"%>
<%@page
import="java.sql.DriverManager"%>
<%@page
import="java.util.Properties"%>
<%@page
import="java.sql.ResultSet"%>
<%@page
import="java.sql.Connection"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible"
content="IE=edge">
<meta name="viewport"
content="width=device-width, initial-scale=1">
<title>Music Catalog</title>
<link href="newcss.css"
rel="stylesheet">
<link href="newcss1.css"
rel="stylesheet">
<!-- HTML5 Shim and Respond.js
IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script
src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script
src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<%HttpSession s =
request.getSession(true);connection = null;rs;song = new
String("");artist = new String("");album = new
String("");genre = new String("");released = null;duration
= 0;ids = 0;ida = 0;idg = 0;idu = 0;idar = 0;rating =
0;.setContentType("text/html");{.forName("com.mysql.jdbc.Driver");properties
= new Properties();.setProperty("user",
"root");.setProperty("password",
"123");.setProperty("useUnicode",
"true");.setProperty("characterEncoding",
"utf8");= DriverManager.getConnection("jdbc:mysql://localhost:3306/music",
properties);
String sql = "select * from songs
where name ='" + request.getParameter("search") + "'";
Statement st =
connection.createStatement();.executeQuery(sql);= st.getResultSet();(rs.next())
{= rs.getInt("duration");= rs.getInt("id");
}= "select * from album_songs where song
='" + ids + "'";.executeQuery(sql);=
st.getResultSet();(rs.next()) {= rs.getInt("album");
}= "select genre from genre_songs where
song ='" + ids + "'";.executeQuery(sql);=
st.getResultSet();(rs.next()) {= rs.getInt("genre");
}= "select * from albums where id ='"
+ ida + "'";.executeQuery(sql);= st.getResultSet();(rs.next()) {=
rs.getDate("released");= rs.getString("name");
}= "select * from genre where id ='" +
idg + "'";.executeQuery(sql);= st.getResultSet();(rs.next()) {=
rs.getString("name");
}= "select artist from album_artists where
album ='" + ida + "'";.executeQuery(sql);=
st.getResultSet();(rs.next()) {= rs.getInt("artist");
}= "select * from artists where id ='"
+ idar + "'";.executeQuery(sql);= st.getResultSet();(rs.next()) {=
rs.getString("name");
}= "select * from users where name ='"
+ s.getAttribute("name") + "'";.executeQuery(sql);=
st.getResultSet();(rs.next()) {= rs.getInt("id");
}= "select * from ratings where user
='" + idu + "' and song='" + ids +
"'";.executeQuery(sql);= st.getResultSet();(rs.next()) {=
rs.getInt("rating");
}.setAttribute("idu",
idu);.setAttribute("ids", ids);.close();.close();
} catch (Exception e)
{.out.println("Exception is ;" + e);
}
%>
<body>
<div id="container">
<div id="header"><h1>
<p>
</div>
<div id="content">
<ul>
<%if (ids != 0) {%>
<li><a>
<li><a>
<li><a href="#"
data-toggle="modal"
data-target="#musicInfo3">Album:<%=album%></a></li>
<li><a href="#"
data-toggle="modal" data-target="#musicInfo4">Released:<%=released%></a></li>
<li><a href="#"
data-toggle="modal"
data-target="#musicInfo5">Duration:<%=duration%></a></li>
<li><a href="#"
data-toggle="modal"
data-target="#musicInfo5">Genre:<%=genre%></a></li>
<%if (rating == 0) { %>
<form role="form" action="Raiting"
method="POST">
<li><a href="#"
data-toggle="modal"
data-target="#musicInfo5">Rating:<select
name="mySelect">
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</select></a></li>
<button
id="submitSearch">estimate</button>
</form>
<%} else {%><li><a
href="#" data-toggle="modal"
data-target="#musicInfo5">Rating:<%=rating%></a></li>
<%}%>
<%} else {%> <li><a
href="#" data-toggle="modal"
data-target="#musicInfo5">Song not found please try
again</a></li>
<%}%>
</ul>
</div>
<div id="sidebar">
<form role="form"
action="music.jsp" method="POST">
<div id="sidebarUp">
<p>
<input id="musicSearch"
name="search"/>
<button
id="submitSearch">SEARCH</button>
</div>
</form>
</div>
<script
src="js/bootstrap.min.js"></script>
</body>
</html>