Формирование базы данных книг магазина на Java

Создание и разработка информационной системы автоматизации учета книг в книжном магазине. Описание предметной области, постановка задачи и обзор методов ее решения. Модели и алгоритмы представления системы. Обоснование технических и программных средств.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 31.03.2012
Размер файла 1,7 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

СОДЕРЖАНИЕ

  • Введение
  • 1. Описание предметной области
  • 2. Постановка задачи и обзор методов ее решения
  • 3. Модели представления системы и их описание
  • 4. Информационная модель системы и ее описание
  • 5. Обоснование технических и программных средств
  • 6. Описание алгоритмов функционирования системы
  • 7. Руководство пользователя
  • 8. Результаты тестирования разработанной системы и оценка выполнения задач
  • Заключение
  • Литература
  • Приложение А. (обязательное) Функциональная модель
  • Приложение Б. (обязательное) UML-диаграммы
  • Приложение В. (обязательное) Модели представления Базы данных
  • Приложение Г. (обязательное) SQL скрипт
  • Приложение Д. (обязательное) Блок-схема

Приложение Е. (обязательное) Листинг программы

ВВЕДЕНИЕ

Целью данной курсовой работы является создание и разработка информационной системы книжного магазина. Данная информационная система (ИС) содержит основные сведения полезные для книжного магазина. В качестве информационной системы выступает база данных, написанная в программе mysql. Такая база данных необходима для упрощения организации работы магазина с книгами и клиентами, поскольку имеется большое количество книг и много покупателей. База данных - это совокупность взаимосвязанных данных, которые используются несколькими приложениями. В базе данных сведения из каждого источника сохраняются в отдельной таблице. При работе с данными из нескольких таблиц устанавливаются связи между таблицами. Для поиска и отбора данных, удовлетворяющих определенным условиям, создается запрос. Запросы позволяют также обновить, добавить или удалить записи, выполнить встроенные или специальные вычисления. Для просмотра, ввода или удаления данных прямо в таблице применяются формы. Форма позволяет отобрать данные из одной или нескольких таблиц и вывести их на экран, используя стандартный или созданный пользователем макет.

Магазин выставляет на продажу большое количество книг, в котором очень сложно ориентироваться. Задачами данного курсового проекта является реализовать необходимость поиска нужной книги или же занесения новой книги в каталог, или изменение каких-то неточных данных, или удаление книги, или ненужных издательств, а так же содержание сведений о совершенных покупках и прибыли. Эти и другие задачи значительно проще решить, если имеется база данных книжного магазина. Таким образом, база данных создается для автоматизации учета книг магазина. Разрабатываемая база данных предназначена для быстрого и эффективного обновления данных, быстрой и легкой навигации в имеющемся ассортименте книг, что позволяет облегчить и упростить работу сотрудников магазина.

1. ОПИСАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ

Предметной областью для данного проекта является формирование базы данных книг магазина.

Работа книжного магазина является довольно сложным и трудоёмким процессом. Для учёта книг необходимо оформлять и вести довольно большое количество документации (оформление накладных на приход книг, оформление скидок и лицензий и т.д.).

В современном мире почти каждый человек использует на своей работе вычислительную технику, так же и во всех книжных магазинах работа ведётся с помощью автоматизированных систем и технологий.

Основные данные, которые использовались в данной информационной системе, были данные о книгах:

- уникальный номер книги,

- имя книги,

- год издательства,

- стоимость книги,

- количество книг, имеющихся на полках магазина,

- уникальный номер издательства,

- уникальный номер автора,

Можно сделать выводы, что при автоматизации книжного магазина работа в магазине станет не только более лёгкой, но это ускорит работу обслуживающего персонала с клиентами.

На начальной стадии разработки данной функциональной системы был поэтапно составлен процесс продажи книг в магазине. Для графического описания модели был использован стандарт IDEF0 (Integration Definition for Function Modeling - методология функционального моделирования, предназначенная для описания бизнес-процессов).

На контекстной диаграмме верхнего уровня (Приложение А, рисунок А.1) представлена функциональная модель «Книжный магазин», а также определены потоки входных и выходных данных, механизмы ограничения и управления данными.

Входная информация: данные о доступных книгах, данные о поставщиках и авторах. Информация, полученная на входе, обрабатывается и преобразуется во входные данные: прибыль магазина, отчёт о проданных книгах, остатки книг в магазине. Управляющими механизмами являются менеджеры магазина. Механизм ограничения: правила и документы, по образцу которых ведётся работа магазина.

Рисунок А.2 (Приложение А) отображает декомпозицию контекстной диаграммы.

2. ПОСТАНОВКА ЗАДАЧИ И ОБЗОР МЕТОДОВ ЕЕ РЕШЕНИЯ

Разработать базу данных в программе mysql для предметной области «Книжный магазин».

Автоматизированная информационная система должна обеспечивать обработку данных следующим образом: книжный магазин посещает клиент с заказом о купле книг, в магазине должна иметься база данных с записями обо всех имеющихся книгах.

База данных предполагает ввод-вывод следующих данных:

1. Вводить данные о книгах;

2. Выводить информацию об имеющихся книгах по любому запросу.

В информационной системе предполагается наличие следующих функций:

1. Ввод, редактирование и удаление информации об издательствах;

2. Ввод, редактирование и удаление данных об авторах;

3. Ввод, редактирование и удаление данных о книгах;

4. Формирование данных к продаже;

5. Формирование прибыли магазина;

6. Список остатков книг в магазине.

В программе необходимо предусмотреть корректность ввода какой-либо информации. Программа должна реагировать на любые несанкционированные действия.

Программа должна быть лёгкой для восприятия, доступной, надёжной и удобной для извлечения пользователем любой необходимой информации.

3. МОДЕЛИ ПРЕДСТАВЛЕНИЯ СИСТЕМЫ И ИХ ОПИСАНИЯ

В данном разделе будет продемонстрировано моделирование информационной системы с помощью стандарта UML, который использует графические обозначения для создания абстрактной модели системы и предназначен для определения, визуализации, проектирования и документирования в основном программных систем. UML позволяет описать систему практически со всех возможных точек зрения и разные аспекты поведения системы.

Для данной курсовой работе были построены такие диаграммы, как диаграмма вариантов использования, диаграмма последовательности, диаграмма состояний, диаграмма классов, диаграмма развертывания, диаграмма компонентов.

Рассмотрим данные диаграммы.

Диаграмма вариантов использования состоит из актеров, для которых система производит действие и собственно действия Use Case, которое описывает то, что актер хочет получить от системы.

В данной диаграмме вариантов использования (Приложение Б, рисунок Б.1) в роли актёров выступают покупатель и программист. Программист, как видно из диаграммы, может управлять данными (добавлять книгу, изменять данные, искать книгу по определённому критерию), однако для этого ему необходимо подключиться к серверу. Покупатель, также может просматривать данные о книгах, а также добавлять книги в корзину.

Для моделирования взаимодействия объектов во времени в языке UML используются диаграммы последовательности.

Для демонстрации диаграммы последовательности рассмотрим диаграмму добавления книги в базу данных (Приложение Б, рисунок Б.2). Действие начинается при нажатии кнопки «Добавить книгу» (посылается запрос о добавлении книги в базу данных). После обработки запроса, посылается новый запрос на Server о взятии нужной информации об издательстве, так как при добавлении книги пользователь выбирает издательство данной книги. Такая же операция проделывается и для автора. На Server обрабатывается запрос и посылается новый запрос на book sfinal для получения необходимой информации об издательстве. На books final обрабатывается запрос и посылается информация на Server, а с Server на Client. На Client обрабатывается полученная информация и посылается новый запрос о добавлении книги в базу. После того как книга добавляется в базу данных, на Client приходит сообщение, что книга добавлена в базу данных.

Диаграмма классов описывает структуру системы, показывая её классы, их атрибуты и операторы, а также взаимосвязи этих классов.

На рисунке Б. 3 и рисунке Б. 4 (Приложение Б) изображены диаграмма классов клиента и диаграмма классов сервера соответственно.

Диаграмма состояний предназначена для отображения состояний объектов системы, имеющих сложную модель поведения.

На рисунке Б. 5 (Приложение Б) изображена диаграмма состояний для данной системы. Диаграмма компонентов показывает разбиение программной системы на структурные компоненты и связи между компонентами.

На рисунке Б. 6 (Приложение Б) изображена диаграмма компонентов для данной системы. Диаграмма развёртывания предназначена для визуализации элементов и компонентов программы, существующих лишь на этапе ее исполнения. На рисунке Б. 7 (Приложение Б) изображена диаграмма развёртывания для данной системы.

4. ИНФОРМАЦИОННАЯ МОДЕЛЬ СИСТЕМЫ И ЕЕ ОПИСАНИЕ

Erwin - средство разработки структуры базы данных. Erwin создает визуальное представление для данного проекта. Это представление может использоваться для детального анализа, уточнения и распространения как части документации, необходимой разработки.

Процесс построения информационной модели состоит из следующих шагов:

1. Определение сущностей;

2.Определение зависимостей между сущностями;

3.Задание первичных и альтернативных ключей;

4. Определение атрибутов сущностей;

5.Составление логической (logical) модели;

6. Переход к физическому (physical) описанию модели.

Так можно сделать вывод, что в erwin существуют два уровня представления и моделирования - логический и физический.

Рассмотрим каждый уровень по отдельности.

Логический уровень означает прямое отображение фактов из реальной жизни. На логическом уровне не рассматривается использование конкретной СУБД, не определяются типы данных и не определяются индексы для таблиц.

Проанализировав данную предметную область, в проекте было решено создать четыре сущности (рисункеВ.1 (Приложение В)):

- книги;

- авторы книг;

- издательства книг;

- продажи.

Рассмотрим каждую сущность по отдельности.

Сущность «книги» содержит информацию обо всех книгах и имеет следующие атрибуты:

ь Idbook - уникальный номер книги;

ь Namebook - название книги;

ь Yearofpublish - год издательства;

ь Count - количество, имеющихся книг в наличии;

ь Price - стоимость книги;

ь Idathor - уникальный номер автора;

ь Idpublish - уникальный номер издательства;

Сущность «издательства» содержит информацию об издательствах выпускаемых книг и имеет следующие атрибуты:

ь Idpublish - уникальный номер издательства;

ь Name - название издательства;

Сущность «авторы» содержит информацию об авторах книг и имеет следующие атрибуты:

ь Idathor - уникальный номер автора;

ь Nameathor - ФИО автора;

Сущность «продажи» содержит информацию о продажах книг и имеет следующие атрибуты:

ь Idpurchase - уникальный номер продажи;

ь Idbook - уникальный номер книги;

ь Price - цена;

ь Date_T - дата продажи.

Сущности «книги» и «издательства», «книги» и «авторы», «продажи» и «книги» соединены между собой связями FK_publish_book (связь «один ко многим»), FK_athor_book (связь «один ко многим») и FK_book_purchase (связь «один ко многим»). Первая связь говорит о том, что одноиздательство может предлагать магазинубольшое разнообразие книг. Вторая связь говорит о том, что в магазине может быть много книг одного автора.

Второй (физический) уровень модели Erwin, зависит от конкретной СУБД, содержит имена объектов, индексы и типы данных (рисункеВ.2 (Приложение В)).

Если все атрибуты являются простыми и их нельзя разделить на составные части (без потери смысла), то сущность находиться в первой нормальной форме. Для того чтобы привести данную систему учёта книг в магазине к первой нормальной форме, необходимо разделить сложные атрибуты на атомарные, связать сущности связью «один ко многим».Атрибуты, хранящие замысловатую информацию, необходимо разделить на более простые. Проанализировав данную систему работы книжного магазина, можно сделать вывод, что данная модель находиться в первой нормальной форме.

Если модель находиться в первой нормальной форме, отсутствуют не ключевые атрибуты, зависящие от первичного ключа, то можно говорить, что модель находиться во второй нормальной форме. А так же, если сущность имеет первичный ключ и находится в первой нормальной форме, то можно говорить, что данная модель находиться во второй нормальной форме. Рассмотрев данную модель учёта книг, можно сделать вывод, что она находится во второй нормальной форме, так как сущности находятся в первой нормальной форме и имеют первичные ключи (т.е. ключ, состоящий из одного атрибута).

Если сущность находится во второй нормальной форме и отсутствуют функциональные зависимости между ее неключевыми атрибутами, то такая сущность находиться в третьей нормальной форме. Проанализировав данную систему учёта книг, можно сказать, что данная модель находится в третьей нормальной форме.

5. ОБОСНОВАНИЕ ТЕХНИЧЕСКИХ И ПРОГРАММНЫХ СРЕДСТВ РАЗРАБОТКИ

Задача построения логической и физической моделей базы данных была реализована с помощью использования локального средства технологии еrwin. Erwin - средство концептуального моделирования БД, использующее методологию IDEF1.X. Данное средство было выбрано т.к. оно позволило не только построить логическую и физическую модели базы данных, но и осуществить последующий реинжиниринг существующей БД, т.е. сгенерировать, созданную в еrwin информационную модель в СУБД mysql Workbench5.2 CE.

В качестве целевой базы данных была выбрана СУБД.

Сам проект написан на языке программирования Java, чему поспособствовал ряд факторов.

Во-первых, одним из основных преимуществ языка Java является независимость от платформы, на которой выполняются программы. Это действительно необходимо, когда программы загружаются по сети для последующего выполнения под управлением различных операционных систем.

Во-вторых, язык Java является полностью объектно-ориентированным языком, даже в большей степени, чем С++. Все сущности в языке Java являются объектами, за исключением лишь некоторых основных типов, например, чисел.

В-третьих, на языке Java намного проще разрабатывать программы, не содержащие ошибок. Разработчики языка Java снабдили его средствами, позволяющими исключить саму возможность создавать программы, в которых были бы скрыты наиболее распространённые ошибки. Для этого в языке Java сделано следующее:

- исключена возможность явного выделения и освобождения памяти;

- введены истинные массивы и запрещена арифметика указателей;

- исключена возможность перепутать оператор присваивания с оператором сравнения на равенство;

- исключено множественное наследование. Оно заменено на понятие интерфейс.

В-четвёртых, обладая большой библиотекой программ для передачи данных на основе протоколов TCP/IP, язык Java предоставляет мощный и удобный механизм для работы в сети.

В-пятых, в языке Java довольно лёгкий механизм организации многопоточности. Потоки в языке Java могут использовать преимущества многопроцессорных систем, что делает этот язык привлекательным для разработки серверов.

И, наконец, язык Java во многих отношениях является более динамичным, чем языки С или С++. Он был разработан так, чтобы легко адаптироваться к постоянно изменяющейся среде. В библиотеки можно свободно добавлять новые методы и объекты, не причиняя никакого вреда.

Для создания проекта использовалась среда разработки netbeansIDE, которая является одной из мощнейших средств разработки программных продуктов.

6. ОПИСАНИЕ АЛГОРИТМОВ ФУНКЦИОНИРОВАНИЯ СИСТЕМЫ

Заметим, что вся бизнес-логика функционирования системы сосредоточена в серверной части. Там выполнены такие операции, как соединение с базой данных, добавление данных в базу, редактирование данных, удаление записей из неё, а также чтение данных.

Когда пользователь выбирает определенную операцию, клиент отправляет серверу объект или какую-нибудь команду. После того, как сервер обработает полученную информацию, он посылает клиенту результат его работы. В приложении Д изображена блок-схема для данной операции.

Для того чтобы наглядно отобразить алгоритм, реализующий бизнес-логику северной части системы «Книжный магазин», мы рассмотрим на примере добавления издательства в базу данных.

После того как клиент выбирает операцию добавления издательства, серверу посылается объект класса Dialog с информацией номера сообщения и строки с запросом в базу данных:

This.outnetstream.writeobject(new Dialog("1", sqlcurrency));

В строке sqlcurrency уже хранится информация об издательстве (имя издательства), которое пользователь хочет добавить в базу данных.

На следующем этапе будет выполняться запрос для добавления издательства в базу данных, в таблицу издательство (publish):

String sqlcurrency = "INSERT INTO athor (nameathor) VALUES ('" +

jnameathor.gettext() + "');";

Описание:

Nameathor- имя издательства;

Jnameathor.gettext() - получения имени издательства из текстового поля для ввода;

После запросы вызываются методы исполнения:

Sqlcommand.executeupdate(inmsg.getnexttype());

Аналогичным способом реализуются и остальные запросы на выполнение команд пользователя.

7. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ

Для начала запускается серверная часть (рисунок 7.1).

Рисунок 7.1 - Запуск серверной части

После запуска сервера можно запускать клиентскую часть приложения (рисунок 7.2).

Рисунок 7.2 - Запуск клиентской части

После запуска клиента необходимо выбрать пункт меню «Подключение к серверу», после чего появиться окно «Соединение с сервером» (рисунок 7.3), в котором необходимо порт серверного компьютера.

Рисунок 7.3 - Соединение с сервером

При нажатии кнопки «Подключиться» появляется окно клиента, в котором мы продолжаем работу (рисунок 7.4).

Рисунок 7.4 - Окно клиента после подключения

После подключения к серверу пользователю будет доступны следующие операции:

· Добавление книги в базу данных;

· Добавление автора в базу данных;

· Добавление издательства в базу данных;

· Редактирование данных;

· Удаление данных;

· Просмотр базы данных;

· Добавление книги в корзину покупателя;

· Просмотр корзины покупателя;

· Оплата корзины;

· Просмотр прибыли за день;

· Поиск книги по заданному критерию.

8. РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ РАЗРАБОТАННОЙ СИСТЕМЫ И ОЦЕНКА ВЫПОЛНЕНИЯ ЗАДАЧ

Для тестирования разработанной системы «Книжный магазин» следует её запустить и проверить работоспособность всех имеющихся операций.

Для начала проверим операцию добавления книги.

Если пользователь некорректно ввёл данные о книге, то высветится окно о некорректном вводе. Рассмотрим пример добавления книги в базу данных. Так таблица, содержащая данные о книгах, выглядит изначально (рисунок 8.1):

Рисунок 8.1 - Данные о книгах

При выборе в главном меню пункта «Добавить книгу» появляется окно «Добавление книги», в котором необходимо вписать имя книги, год публикации, количество книг, стоимость книги и выбрать издательство книги и автора (рисунок 8.2):

Рисунок 8.2 - Ввод данных о книге

После добавления книга будет отображаться в таблице, содержащей информацию о книгах (рисунок 8.3):

Рисунок 8.3 - Отображение добавленной книги в таблице

Аналогичным способом добавляется новоеиздательство и автор книги в базу данных.

Рассмотрим пример редактирования данных об издательстве. Выбираем нужную ячейку для редактирования, изменяем данные на нужные нам, жмем клавишу «Enter». Появляется окно с данными и уже внесенными изменениями (рисунок 8.4).

Рисунок 8.4 - Редактирование данных

Также при просмотре базы данных пользователь может удалить книгупри нажатие на кнопки «Удалить книгу»,купить книгупри нажатии кнопки «Купить». Пользователь может просмотреть данные о продажи при нажатии кнопки «Просмотр продаж» (рисунок 8.5).

Рисунок 8.5 - Отображение покупательской корзины

Аналогичным способом можно проделать и остальные похожие действия.

Поиск книг осуществляется по заданным критериям. Продемонстрируем работу операции «Поиск» на примере. Для этого необходимо ввести необходимые критерии, после чего в таблице отобразиться вся информация об искомойкниге (рисунок 8.7):

Рисунок 8.7 - Ввод данных для поиска

Оценив работу программы, можно сделать выводы:

· В программе предусмотрен удобный и понятный интерфейс;

· Выполнены все поставленные задачи;

· Предусмотрена работа для отлова исключительных ситуаций, в случае возникновения которых пользователь получает сообщение о некорректном вводе;

· Программа выполнена в архитектуре клиент-сервер;

· Предусмотрена работа одновременно с несколькими клиентами.

ЗАКЛЮЧЕНИЕ

Целью данного курсового проекта являлась разработка эффективной системы «Книжный магазин».

В программе реализована многопоточность, которая позволяет получать одновременный доступ к базе данных книг с различных удаленных компьютеров.

Приложение поддерживает «клиент - серверную» архитектуру.

Программа содержит полный набор методов, которые необходимы для создания базы данных, поиска информации и выполнения других операций с базой данных (добавление, удаление, редактирование, поиск).

Данная информационная система позволяет систематизировать полученную и имеющуюся информацию и значительно упрощает работу.Значительно упрощает работа продавца книжного магазина: систематизирует поиск нужной книги, оплату покупательской корзины, просмотра чека и общей суммы к оплате, просмотра прибыли в течении дня.

Конечно же, следует заметить, что данный программный продукт всего лишь упрощённая версия более сложных программных систем учёта книг в магазине.

Однако возможно дальнейшее развитие данного проекта с помощью добавления новых операций и дополнительных функций.

автоматизация программный учет книга

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

1. Википедия [Электронный ресурс]. - Электронные данные. - Режим доступа: http://ru.wikipedia.org

2. Справочник программиста [Электронный ресурс]. - Электронные данные. - Режим доступа: http://ci.ru

3. Буч, Г. UML Руководство пользователя / Г. Буч. - М.: Вильямс, 2005. - 260с.

4. Гольцман, В. MySQL 5.0. Библиотека программиста / В. Гольцман. - СПб.: Питер Ком, 2006. - 253 с.

5. Федотова, Д. CASE - технологии: Практикум. - М.: Горячая линия -Телеком, 2005. - 160с

6. Хорстманн, К.JAVA2. Библиотека профессионала. Основы. Том 1. 8-е издание. Пер.с англ. - М: ООО «И.Д.Вильямс», 2009 - 816с

7. Хорстманн, К. Хорстманн и Г. Корнелл. JAVA2. Том 2. Тонкости программирования. Пер. с англ. - М: ООО «Вильямс», 2003 - 1120с

ПРИЛОЖЕНИЕ А (обязательное)

Функциональная модель

Рисунок А.1 - Контекстная диаграмма верхнего уровня

Рисунок А.2 - Декомпозиция контекстной диаграммы

ПРИЛОЖЕНИЕ Б (обязательное)

UML-диаграммы

Рисунок Б.1 - Диаграмма вариантов использования

Продолжение приложения Б

Рисунок Б.2 - Диаграмма последовательности

Продолжение приложения Б

Продолжение приложения Б

Рисунок Б. 3 - Диаграмма классов для клиентского приложения

Продолжение приложения Б

Рисунок Б. 4 - Диаграмма классов для серверного приложения

Рисунок Б. 5- Диаграммы классов пакета BooksCollection

Рисунок Б. 6 -Диаграмма состояний

Продолжение приложения Б

Рисунок Б. 7 - Диаграмма компонентов

Рисунок Б. 8 - Диаграмма развёртывания

ПРИЛОЖЕНИЕ В (обязательное)

Модели представления Базы данных

Рисунок В. 1 - Логическая модель представления системы учета книг в магазине

Рисунок В. 2 - Физическая модель представления системы учета книг в магазине

ПРИЛОЖЕНИЕ Г (обязательное)

SQL - скрипт

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS,

UNIQUE_CHECKS=0;

SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,

FOREIGN_KEY_CHECKS=0;

SET @OLD_SQL_MODE=@@SQL_MODE,

SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `books1` DEFAULT CHARACTER

SET utf8 COLLATE utf8_general_ci ;

USE `books1`;

CREATE TABLE IF NOT EXISTS `books1`.`publish` (

`Idpublish` INT(11) NOT NULL AUTO_INCREMENT ,

`Name` VARCHAR(50) NOT NULL ,

PRIMARY KEY (`Idpublish`) )

ENGINE = innodb

DEFAULT CHARACTER SET = utf8

COLLATE = utf8_general_ci;

CREATE TABLE IF NOT EXISTS `books1`.`book` (

`Idbook` INT(11) NOT NULL AUTO_INCREMENT ,

`namebook` VARCHAR(50) NOT NULL ,

`yearofpublish` INT(11) NULL DEFAULT NULL ,

`Count` VARCHAR(50) NULL DEFAULT NULL ,

`Price` INT(11) NULL DEFAULT NULL ,

`Idathor` INT(11) NOT NULL ,

`Idpublish` INT(11) NOT NULL ,

PRIMARY KEY (`Idbook`) ,

INDEX `FK_book_publish` (`Idpublish` ASC) ,

INDEX `FK_book_athor` (`Idathor` ASC) ,

CONSTRAINT `FK_book_publish`

FOREIGN KEY (`Idpublish` )

REFERENCES `books1`.`publish` (`Idpublish` )

ONDELETECASCADE

ON UPDATE CASCADE,

CONSTRAINT `FK_book_athor`

FOREIGN KEY (`Idathor` )

REFERENCES `books1`.`athor` (`Idathor` )

ON DELETE CASCADE

ON UPDATE CASCADE)

ENGINE = innodb

DEFAULT CHARACTER SET = utf8

COLLATE = utf8_general_ci;

CREATE TABLE IF NOT EXISTS `books1`.`athor` (

`Idathor` INT(11) NOT NULL AUTO_INCREMENT ,

`nameathor` VARCHAR(50) NOT NULL ,

PRIMARY KEY (`Idathor`) )

ENGINE = innodb

DEFAULT CHARACTER SET = utf8

COLLATE = utf8_general_ci;

CREATE TABLE IF NOT EXISTS `books1`.`purchase` (

`Idpurchase` INT(11) NOT NULL AUTO_INCREMENT ,

`IdBook` INT(11) NOT NULL ,

`Price` INT(11) NULL DEFAULT NULL ,

`Date_T` TimeStamp NOT NULL DEFAULT NOW(),

PRIMARY KEY (`Idpurchase`) ,

INDEX `FK_purchase_book` (`Idbook` ASC) ,

CONSTRAINT `FK_purchase_book`

FOREIGN KEY (`Idbook` )

REFERENCES `books1`.`book` (`Idbook` )

ON DELETE CASCADE

ON UPDATE CASCADE)

ENGINE = InnoDB

DEFAULT CHARACTER SET = utf8

COLLATE = utf8_general_ci;

SET SQL_MODE=@OLD_SQL_MODE;

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;

SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

ПРИЛОЖЕНИЕ Д (обязательное)

Блок-схема

ПРИЛОЖЕНИЕ Е (обязательное)

Листинг программы

Листинг некоторых главных функций программы

packageServerShlyks;

importjava.io.IOException;

importjava.net.ServerSocket;

importjava.net.Socket;

importjava.sql.*;

importjava.util.Calendar;

public class server_frame extends javax.swing.JFrame {

staticint count = 1, quit=0;

private static Connection connection = null;

int a = 8189;

public static String pass = "";

publicserver_frame() {

initComponents();

Port.setVisible(true);

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jScrollBar1 = new javax.swing.JScrollBar();

Port = new javax.swing.JDialog();

jLabel2 = new javax.swing.JLabel();

PortID = new javax.swing.JFormattedTextField();

OkServer = new javax.swing.JButton();

jLabel3 = new javax.swing.JLabel();

jpass = new javax.swing.JTextField();

Port.setTitle("Ввод порта сервера");

Port.setBackground(newjava.awt.Color(153, 153, 153));

Port.setForeground(new java.awt.Color(204, 0, 0));

Port.setLocationByPlatform(true);

Port.setMinimumSize(new java.awt.Dimension(350, 200));

Port.addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEventevt) {

PortWindowClosing(evt);

}

});

jLabel2.setFont(new java.awt.Font("Batang", 1, 14));

jLabel2.setText("Ввод порта сервера");

jLabel2.setMaximumSize(new java.awt.Dimension(102, 14));

PortID.setBorder(new

javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAIS

ED));

try {

PortID.setFormatterFactory(new

javax.swing.text.DefaultFormatterFactory(new

javax.swing.text.MaskFormatter("####")));

} catch (java.text.ParseException ex) {

ex.printStackTrace();

}

PortID.setText("8189");

PortID.setDisabledTextColor(new java.awt.Color(255, 255, 255));

PortID.setFont(new java.awt.Font("Bookman Old Style", 0, 14));

PortID.setSelectionColor(new java.awt.Color(255, 255, 255));

OkServer.setBackground(new java.awt.Color(255, 255, 255));

OkServer.setFont(new java.awt.Font("Batang", 0, 11));

OkServer.setText("ПОДТВЕРДИТЬ");

OkServer.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.sw

ing.border.BevelBorder.RAISED));

OkServer.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEventevt) {

OkServerActionPerformed(evt);

}

});

jLabel3.setFont(new java.awt.Font("Batang", 1, 14));

jLabel3.setText("Введитепароль");

jLabel3.setMaximumSize(new java.awt.Dimension(102, 14));

jpass.setFont(new java.awt.Font("Batang", 0, 14));

jpass.setText("12345");

javax.swing.GroupLayoutPortLayout = new

javax.swing.GroupLayout(Port.getContentPane());

Port.getContentPane().setLayout(PortLayout);

PortLayout.setHorizontalGroup(

PortLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEA

DING)

.addGroup(PortLayout.createSequentialGroup()

.addGap(40, 40, 40)

.addGroup(PortLayout.createParallelGroup(javax.swing.GroupLayout.Align

ment.LEADING)

.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.PREFERRED_SIZE))

.addGap(30, 30, 30)

.addGroup(PortLayout.createParallelGroup(javax.swing.GroupLayout.Align

ment.LEADING)

.addComponent(jpass, javax.swing.GroupLayout.PREFERRED_SIZE, 49,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(PortID, javax.swing.GroupLayout.PREFERRED_SIZE, 50,

javax.swing.GroupLayout.PREFERRED_SIZE))

.addContainerGap(98, Short.MAX_VALUE))

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING,

PortLayout.createSequentialGroup()

.addContainerGap(138, Short.MAX_VALUE)

.addComponent(OkServer, javax.swing.GroupLayout.PREFERRED_SIZE,

114, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(123, 123, 123))

);

PortLayout.setVerticalGroup(

PortLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEA

DING)

.addGroup(PortLayout.createSequentialGroup()

.addContainerGap()

.addGroup(PortLayout.createParallelGroup(javax.swing.GroupLayout.Align

ment.BASELINE)

.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(PortID, javax.swing.GroupLayout.PREFERRED_SIZE, 28,

javax.swing.GroupLayout.PREFERRED_SIZE))

.addGap(18, 18, 18)

.addGroup(PortLayout.createParallelGroup(javax.swing.GroupLayout.Align

ment.BASELINE)

.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jpass, javax.swing.GroupLayout.PREFERRED_SIZE,

javax.swing.GroupLayout.DEFAULT_SIZE,

javax.swing.GroupLayout.PREFERRED_SIZE))

.addGap(18, 18, 18)

.addComponent(OkServer, javax.swing.GroupLayout.PREFERRED_SIZE,

30, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(27, 27, 27))

);

jLabel2.getAccessibleContext().setAccessibleName("Вводпортасервера:");

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOS

E);

setTitle("Серверзапущен");

javax.swing.GroupLayout layout = new

javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING

)

.addGap(0, 252, Short.MAX_VALUE)

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING

)

.addGap(0, 281, Short.MAX_VALUE)

);

pack();

}// </editor-fold>

private void OkServerActionPerformed(java.awt.event.ActionEventevt) {

a = Integer.parseInt(PortID.getText());

pass = jpass.getText();

Port.setVisible(false);

System.out.println(Calendar.getInstance().getTime() + "

Серверработает...");

try {

inti = 1;

ServerSocket s = new ServerSocket(a);

while (quit!=1) {

Socket incoming = s.accept();

System.out.println("Клиент №" + count);

Runnable r = new ServerS(incoming, i);

Thread t = new Thread(r);

t.start();

count++;

}

} catch (IOException e) {

}

}

private void PortWindowClosing(java.awt.event.WindowEventevt) {

quit=1;

}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

newserver_frame().setVisible(false);

}

});

}

// Variables declaration - do not modify

privatejavax.swing.JButtonOkServer;

privatejavax.swing.JDialog Port;

privatejavax.swing.JFormattedTextFieldPortID;

privatejavax.swing.JLabel jLabel2;

privatejavax.swing.JLabel jLabel3;

privatejavax.swing.JScrollBar jScrollBar1;

privatejavax.swing.JTextFieldjpass;

// End of variables declaration

}

packageclientshlyks;

importjava.io.IOException;

importjava.io.ObjectInputStream;

importjava.io.ObjectOutputStream;

importjava.net.Socket;

importjava.net.UnknownHostException;

/**

*

* @author Viktoriya

*/

public class SocketClass extends Socket {

private static SocketClass _instance = null;

private static ObjectInputStreaminNetStream;

private static ObjectOutputStreamoutNetStream;

privateSocketClass(String host, intportNum) throws

UnknownHostException, IOException {

super(host, portNum);

}

public static synchronized SocketClassgetInstance(String host, int port)

throws

UnknownHostException, IOException {

if (_instance == null) {

_instance = new SocketClass(host, port);

SocketClass.setOutNetStream(newObjectOutputStream(_instance.getOutput

Stream()));

SocketClass.setInNetStream(new

ObjectInputStream(_instance.getInputStream()));

}

return _instance;

}

publicObjectInputStreamgetInNetStream() {

returninNetStream;

}

publicObjectOutputStreamgetOutNetStream() {

returnoutNetStream;

}

public static void setInNetStream(ObjectInputStreaminNetStream) {

SocketClass.inNetStream = inNetStream;

}

public static void setOutNetStream(ObjectOutputStreamoutNetStream) {

SocketClass.outNetStream = outNetStream;

}

}

private void viewing() {

if ("Издательство".equals(myFlag)) {

try {

outNetStream.writeObject(new Dialog("3", "SELECT * FROM publish"));

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

Dialog message = new Dialog();

PublishList object = new PublishList();

DefaultTableModeljTempTableModel = new DefaultTableModel();

jTempTableModel.setColumnIdentifiers(this.Vector1);

Vector tableData = new Vector();

try {

object = (PublishList) inNetStream.readObject();

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

} catch (ClassNotFoundException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

for (int i = 0; i <object.getSizeOfList(); i++) {

VectorrowData = newVector();

rowData.add(object.getPublishOfList(i).getKey());

rowData.add(object.getPublishOfList(i).getName());

tableData.add(rowData);

jTempTableModel.addRow(rowData);

}

DefaultTableModeljTableModel = jTempTableModel;

jTable1.setModel(jTableModel);

tm = jTable1.getModel();

tm.addTableModelListener(new TableModelListener() {

@Override

public void tableChanged(TableModelEventtme) {

if (tme.getType() == 0) {

String sqlCom;

if (tme.getColumn() != 0) {

sqlCom = "UPDATE publish Set " + Vector1[tme.getColumn()] + " = '" + tm.getValueAt(tme.getFirstRow(), tme.getColumn()) + "' WHERE Idpublish = " + tm.getValueAt(tme.getFirstRow(), 0);

} else {

sqlCom = "UPDATE publish Set " + Vector1[tme.getColumn()] + " = '" + tm.getValueAt(tme.getFirstRow(), tme.getColumn()) + "' WHERE Idpublish = " + tm.getValueAt(tme.getFirstRow(), 0);

}

System.out.println(sqlCom);

try {

outNetStream.writeObject(new Dialog("1", sqlCom));

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

}

viewing();

}

});

}

if ("Издательство".equals(myFlag)) {

try {

outNetStream.writeObject(new Dialog("3", "SELECT * FROM publish"));

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

Dialog message = new Dialog();

PublishList object = new PublishList();

DefaultTableModeljTempTableModel = new DefaultTableModel();

jTempTableModel.setColumnIdentifiers(this.Vector1);

Vector tableData = new Vector();

try {

object = (PublishList) inNetStream.readObject();

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

} catch (ClassNotFoundException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

for (int i = 0; i <object.getSizeOfList(); i++) {

Vector rowData = new Vector();

rowData.add(object.getPublishOfList(i).getKey());

rowData.add(object.getPublishOfList(i).getName());

tableData.add(rowData);

jTempTableModel.addRow(rowData);

}

DefaultTableModeljTableModel = jTempTableModel;

jTable1.setModel(jTableModel);

tm = jTable1.getModel();

tm.addTableModelListener(new TableModelListener() {

@Override

public void tableChanged(TableModelEventtme) {

if (tme.getType() == 0) {

String sqlCom;

if (tme.getColumn() != 0) {

sqlCom = "UPDATE publish Set " + Vector1[tme.getColumn()] + " = '" +

tm.getValueAt(tme.getFirstRow(), tme.getColumn()) + "' WHERE Idpublish

= " + tm.getValueAt(tme.getFirstRow(), 0);

} else {

sqlCom = "UPDATE publish Set " + Vector1[tme.getColumn()] + " = '" +

tm.getValueAt(tme.getFirstRow(), tme.getColumn()) + "' WHERE Idpublish

= " + tm.getValueAt(tme.getFirstRow(), 0);

}

System.out.println(sqlCom);

try {

outNetStream.writeObject(new Dialog("1", sqlCom));

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

}

viewing();

}

});

}

if ("Покупка".equals(myFlag)) {

try {

outNetStream.writeObject(new Dialog("10", "SELECT purchase.*,

book.NameBook FROM purchase, book WHERE

book.IdBook=purchase.Idpurchase"));

} catch (IOExceptionex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

Dialog message = new Dialog();

PurchaseList object = new PurchaseList();

DefaultTableModeljTempTableModel = new DefaultTableModel();

jTempTableModel.setColumnIdentifiers(this.Vector4);

Vector tableData = new Vector();

try {

object = (PurchaseList) inNetStream.readObject();

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

} catch (ClassNotFoundException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

for (int i = 0; i <object.getSizeOfList(); i++) {

Vector rowData = new Vector();

rowData.add(object.getPurchaseOfList(i).getKey());

rowData.add(object.getPurchaseOfList(i).getNameBook());

rowData.add(object.getPurchaseOfList(i).getPrice());

rowData.add(object.getPurchaseOfList(i).getDate());

tableData.add(rowData);

jTempTableModel.addRow(rowData);

}

DefaultTableModeljTableModel = jTempTableModel;

jTable1.setModel(jTableModel);

tm = jTable1.getModel();

tm.addTableModelListener(new TableModelListener() {

@Override

public void tableChanged(TableModelEventtme) {

if (tme.getType() == 0) {

String sqlCom;

if (tme.getColumn() != 0) {

sqlCom = "UPDATE purchase Set " + Vector4[tme.getColumn()] + " = '" +

tm.getValueAt(tme.getFirstRow(), tme.getColumn()) + "' WHERE

Idpurchase = " + tm.getValueAt(tme.getFirstRow(), 0);

} else {

sqlCom = "UPDATE purchase Set " + Vector4[tme.getColumn()] + " = '" +

tm.getValueAt(tme.getFirstRow(), tme.getColumn()) + "' WHERE

Idpurchase = " + tm.getValueAt(tme.getFirstRow(), 0);

}

System.out.println(sqlCom);

try {

outNetStream.writeObject(new Dialog("1", sqlCom));

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

}

viewing();

}

});

}

if ("Книга".equals(myFlag)) {

try {

outNetStream.writeObject(new Dialog("6", "SELECT book.*,

publish.Name, athor.NameAthor FROM book, publish, athor WHERE

publish.Idpublish=book.Idpublish AND athor.Idathor=book.Idathor"));

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

Dialog message = new Dialog();

BookList object = new BookList();

DefaultTableModeljTempTableModel = new DefaultTableModel();

jTempTableModel.setColumnIdentifiers(this.Vector3);

Vector tableData = new Vector();

try {

object = (BookList) inNetStream.readObject();

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

} catch (ClassNotFoundException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

for (int i = 0; i <object.getSizeOfList(); i++) {

Vector rowData = new Vector();

rowData.add(object.getBookOfList(i).getKey());

rowData.add(object.getBookOfList(i).getName());

rowData.add(object.getBookOfList(i).getAge());

rowData.add(object.getBookOfList(i).getCount());

rowData.add(object.getBookOfList(i).getPrice());

rowData.add(object.getBookOfList(i).getNamePublish());

rowData.add(object.getBookOfList(i).getNameAthor());

tableData.add(rowData);

jTempTableModel.addRow(rowData);

}

DefaultTableModeljTableModel = jTempTableModel;

jTable1.setModel(jTableModel);

tm = jTable1.getModel();

tm.addTableModelListener(new TableModelListener() {

@Override

public void tableChanged(TableModelEventtme) {

if (tme.getType() == 0) {

String sqlCom;

if (tme.getColumn() != 0) {

sqlCom = "UPDATE book Set " + Vector3[tme.getColumn()] + " = '" +

tm.getValueAt(tme.getFirstRow(), tme.getColumn()) + "' WHERE Idbook =

" + tm.getValueAt(tme.getFirstRow(), 0);

} else {

sqlCom = "UPDATEbookSet " + Vector3[tme.getColumn()] + " = '" +

tm.getValueAt(tme.getFirstRow(), tme.getColumn()) + "' WHEREIdbook =

" + tm.getValueAt(tme.getFirstRow(), 0);

}

System.out.println(sqlCom);

try {

outNetStream.writeObject(new Dialog("1", sqlCom));

} catch (IOException ex) {

Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex);

}

}

viewing();

}

});

}

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.