Разработка интернет-магазина на технологии ASP.NET MVC 3

Характеристика и анализ технологии ASP.NET. Анализ средств разработки и программных продуктов в сфере интернет, обоснование их выбора. Разработка логической, физической модели базы данных, схемы информационно-справочной системы. Руководство пользователя.

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

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

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

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

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

Введение

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

- не надо никуда идти и стоять в очереди;

- не надо думать о доставке товара - это сделают сотрудники интернет-магазина;

- можно сэкономить время;

- просто и удобно оформить заказ.

Интернет-магазины по сравнению с обычными:

- имеют возможность устанавливать более низкие цены на весь ассортимент благодаря меньшим издержкам (в первую очередь за счет аренды торговых площадей, дорогостоящего торгового оборудования);

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

- дают клиентам консультации по выбору и применению товаров в удобное время;

- поиск и доставка редких товаров под заказ.

- возможность покупки товара без посредников в случае покупки товара через интернет - магазин предприятия изготовившего продукцию

«Виртуальные» магазины практически ничем не отличаются от реальных: на сайте можно проконсультироваться у специалиста, узнать подробности о новинках, даже получить карту постоянного покупателя и, соответственно, скидки. Почти все, как в обычном магазине: есть и льготы, и рекламные акции. Стоимость товаров, как правило, чуть ниже, при этом в большинстве случаев доставка товара производится бесплатно и круглосуточно. В интернет-магазинах размещены полные списки товаров с фотографиями, составом и аннотациями, информация о проводимых рекламных акциях для покупателей интернет-магазина, дисконтные программы. В режиме on-line проводятся консультации специалистов. Одним из важнейших моментов деятельности такого предприятия является надёжное аппаратное и программное обеспечение, а также работа курьерской службы по оптимизации маршрутов для уменьшения транспортных расходов и увеличения количества обрабатываемых заказов.

Выше описан идеальный вариант интернет - магазина, согласно современным критериям.

Особенностью отечественной интернет - торговли является то, что покупатель, в большинстве случаев, может лишь ознакомиться с предлагаемым товаром в интернете, заказать его. Сама же покупка происходит, как правило, в офлайн. К оплате принимаются только белорусские деньги, будь то наличные или безналичные. При этом, по оценкам специалистов, более 60% заказов в интернет - магазинах осуществляются не через сайт компании, а звонком по телефону.

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

Настоящая работа посвящена разработке через тестирование интернет - магазина на технологии ASP.NET MVC 3 с использованием движка визуализации Razor появившегося в ASP.NET MVC 3.

1. Аналитический раздел

1.1 Характеристика и анализ технологии ASP.NET

На момент своего появления в 2002 году ASP.NET стала огромным шагом вперед. Стек технологий Microsoft, как он выглядел на то время, показан на рисунке 1.1 [1, c. 22]

Рисунок. 1.1 - Стек технологий ASP.NET Web Forms

В Web Forms разработчики Microsoft попытались сокрыть как протокол HTTP (с его неизбежным отсутствием состояния), так и язык HTML (который на тот момент был незнаком многим разработчикам), моделируя интерфейс пользователя в виде иерархии серверных объектов, представляющих элементы управления. Каждый такой элемент управления отслеживает собственное состояние между запросами (с помощью средства View State по мере необходимости визуализируя себя в виде HTML - разметки, и автоматически подключая события клиентской стороны (например, щелчки на кнопках) с соответствующим кодом их обработки на стороне сервера). Фактически Web Forms - это гигантский уровень абстракции, разработанный для воссоздания классического, управляемого событиями графического пользовательского интерфейса в веб-среде.

Идея состояла в том, что бы веб - разработка выглядела подобно разработке Windows Forms. Отныне разработчикам не нужно иметь дело с сериями независимых запросов и ответов HTTP; теперь можно мыслить терминами сохраняющего свое состояние интерфейса пользователя. Можно забыть о веб-среде и её не поддерживающей состояние природе, а вместо этого строить пользовательские интерфейсы с помощью визуального конструктора, использующего технологию перетаскивания, и полагать - или, по меньшей мере, делать вид - что все происходит на сервере [2, c. 693]

ASP.NET MVC - это платформа для разработки веб-приложений от Microsoft, которая сочетает в себе эффективность и аккуратность архитектуры «модель-представление-контроллер», новейшие идеи и приемы гибкой разработки, а также все лучшее из существующей платформы ASP.NET. Она представляет собой полномасштабную альтернативу традиционной технологии ASP.NET Web Forms, предоставляя существенные преимущества для всех проектов веб-разработки, кроме наиболее тривиальных. Новая платформа ASP.NET MVC обеспечила радикальный сдвиг в разработке веб - приложений на платформе Microsoft. В ней делается упор на ясную архитектуру, шаблоны проектирования и тестируемость, и не предпринимается попыток сокрытия того, как работает веб-среда.

Термин модель - представление - контроллер (model - view - controller) используется с конца 70-х гг. прошлого столетия. Эта модель явилась результатом проекта Smalltalk в компании Xerox, где она была задумана как способ организации некоторых из ранних приложений графического пользовательского интерфейса. Некоторые из нюансов первоначальной модели MVC были связаны с концепциями, специфичными для Smalltalk, такими как экраны и инструменты, но более глобальные понятия все еще применимы к приложениям, и особенно хорошо они подходят для веб-приложений [1, с. 63].

Если оперировать понятиями высокого уровня, архитектурный шаблон MVC означает, что приложение MVC будет разделено, по крайней мере, на три части (рисунок 1.2).

Рисунок 1.2 - Структурные части архитектурного шаблона MVC

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

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

Контроллеры, которые обрабатывают поступающие запросы, выполняют операции с моделью и выбирают представления для визуализации пользователю.

В MVC контроллеры являются классами, обычно производными от класса System. Web. Mvc. Controller. Каждый метод public в классе, унаследованном от класса Controller, называется методом действия и посредством системы маршрутизации ASP.NET связан с конфигурируемым URL. Когда запрос отправляется URL, связанному с методом действия, операторы в классе контроллера выполняются, чтобы провести некоторую операцию по отношению к модели предметной области и затем выбрать представление для отображения клиенту. Взаимодействия между контроллером, моделью и представлением показаны на рисунке 1.3

Рисунок 1.3 - Взаимодействия между контроллером, моделью и представлением

Платформа ASP.NET MVC предоставляет поддержку для выбора механизмов визуализации. В более ранних версиях MVC использовался стандартный механизм визуализации ASP.NET, который обрабатывал ASPX-страницы с применением оптимизированной версии синтаксиса разметки Web Forms. В платформе MVC 3 был введен механизм визуализации Razor, который использует совершенно другой синтаксис. Visual Studio обеспечивает поддержку средства IntelliSense для обоих механизмов визуализации, максимально упрощая внедрение и ответ на данные представления, предоставленные контроллером [1, c. 65].

1.2 Анализ средств разработки и программных продуктов в сфере интернет

Движение за соблюдение веб-стандартов в последние годы усилилось. Веб-сайты просматриваются большим множеством разнообразных устройств и браузеров, чем когда-либо ранее, и веб-стандарты (HTML, CSS, JavaScript) остаются единственной надеждой на достижение когда-либо повсеместного единообразия получения информации из сети. Современные веб-платформы не могут игнорировать потребности бизнеса и стремление разработчиков к соблюдению веб-стандартов.

В это же время превалирующей архитектурой взаимодействия приложений посредством HTTP становится REST (Representational State Transfer - передача состояния представления), полностью затмевая собой SOAP (технологию, лежащую в основе первоначального подхода к веб-службам, использованного в ASP.NET). Стандарт REST описывает приложение терминами ресурсов, представляющих реальные объекты, и стандартных операций (методов HTTP), представляющих доступные операции с этими ресурсами.

Современные веб-приложения обслуживают не только HTML-разметку; часто они должны также предоставлять данные JSON или XML различным клиентским технологиям, включая AJAX, Silverlight и собственные приложения смартфонов. При использовании REST это происходит естественным образом, устраняя историческое различие между веб-службами и веб-приложениями, но требует определенного подхода к обработке HTTP и URL, который было непросто поддерживать с помощью ASP.NET Web Forms [2, c 25].

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

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

Очевидными примерами являются разработка через тестирование (test-driven development - TDD) и ее новейшее воплощение - разработка через тестирование поведения (behavior-driven development - BDD). Идея состоит в проектировании программного обеспечения, сначала описывая примеры желаемого поведения (которые известны, как тесты или спецификации), чтобы в любой момент можно было проверить стабильность приложения и его корректность, выполнив набор спецификаций применительно к текущей реализации. Недостатка в инструментах.NET поддерживающих TDD/BDD, нет, но они не слишком хорошо работают с Web Forms [3, c. 27].

Инструменты модульного тестирования позволяют задавать поведение отдельных классов или иных небольших блоков кода независимо от других. Они могут эффективно применяться только к программному обеспечению, которое спроектировано в виде набора независимых модулей, чтобы каждый тест можно было выполнять независимо от других. К сожалению, подобным образом могут быть протестированы очень немногие приложения Web Forms. Следуя рекомендации о помещении логики в обработчики событий или даже использовании серверных элементов управления, которые непосредственно запрашивают базу данных, в конечном итоге разработчики тесно увязывают логику своих приложений с исполняющей средой Web Forms. Это равносильно смерти для модульного тестирования.

Инструменты автоматизации пользовательского интерфейса позволяют имитировать серии взаимодействий пользователя с готовым действующим экземпляром приложения. Теоретически их можно попользовать в Web Forms, но все рушится, стоит только слегка изменить компоновку страницы. Без принятия специальных мер, платформа Web Forms создает совершенно другие структуры HTML и идентификаторы элементов, делая существующую среду тестирования бесполезной.

Сообщество независимых поставщиков программного обеспечения (independent software vendor - ISV) вместе с сообществом открытого кода разработали множество высококачественных платформ для модульного тестирования (NUnit и MBUnit), имитации (Rhino Mocks и Moq), контейнеров инверсии управления (Ninject), серверов непрерывной интеграции (Cruise Control и TfeamCity), средств объектно-реляционного отображения (NHibemate и Subsonic). Сторонники этих инструментов и методов нашли общий язык, публикуя материалы и организуя конференции под общей маркой ASP.NET. Вследствие своего монолитного проектного решения традиционная технология ASP.NET Web Forms не слишком подходит для таких инструментов и приемов, поэтому удостаивается не слишком большого почтения со стороны этой шумной группы экспертов и интеллектуальных лидеров отрасли [4, c. 28].

Ещё 2004 году платформа Ruby on Ralls была тихим, незаметным продуктом с открытым исходным кодом от неизвестного игрока. Но неожиданно она добилась популярности, изменив правила веб-разработки. Это было связано не с тем, что Ruby on Rails представила революционную технологию, а с тем, что она собрала существующие ингредиенты и смешала их таким чудесным, волшебным, великолепным способом, что смогла пристыдить существующие платформы.

Ruby on Rails (или просто Rails, как ее обычно называют) заключала в себя архитектуру МVС. Применение архитектуры MVC и работа в гармонии с протоколом HTTP, а не в противовес ему, внедрение соглашений вместо обязательного конфигурирования и интеграция инструмента объектно-реляционного отображения (object-relational mapping - ORM) в ядро позволило приложениям Rails без особых усилий завоевать относительно высокую популярность. Это было похоже на открытие того, какой должна быть веб-разработка: все осознали, что все эти годы, по сути, сражались со своими инструментами, и вот, наконец, война окончена.

Продукт Rails доказал, что соблюдение веб-стандартов и соответствие с REST не обязательно должно быть трудно выполнимой задачей. Он также продемонстрировал, что гибкая разработка и разработка через тестирование оказываются наиболее успешными, если сама платформа спроектирована для ее поддержки. С тех пор остальные представители мира веб-разработки пустились наверстывать упущенное.

Благодаря Rails, вскоре появилось множество веб-разработчиков, использующих Ruby в качестве своего основного языка программирования. Но в столь новаторском сообществе появление альтернатив Rails было лишь вопросом времени. Наиболее известная из них, Sinatra, была представлена в 2007 году Sinatra отбрасывает почти всю стандартную инфраструктуру в стиле Rails (маршрутизацию, контроллеры, представления) и просто отображает шаблоны URL на блоки кода Ruby. Посетитель запрашивает URL, что ведет к выполнению блока кода Ruby, и данные отправляются обратно браузеру - и это все. Такой вид веб-разработки невероятно прост, однако он нашел применение в двух основных областях. Во-первых, для тех, кто строит веб-службы, поддерживающие REST, он позволяет решить задачу быстро. Во-вторых, поскольку платформа Sinatra может быть соединена с широким множеством шаблонов HTML с открытым исходным кодом и технологий ORM, она часто используется в качестве основания для сборки нестандартных веб-платформ, способных удовлетворить архитектурные потребности любого проекта.

Тем не менее, платформе Sinatra еще только предстоит отвоевать значительную часть рынка у полноценных MVC-платформ, подобных Rails (или ASP.NET MVC).

Еще одна важная тенденция - переход к использованию JavaScript в качестве основного языка программирования. AJAX первым продемонстрировал важность JavaScript, jQuery показал, что этот язык может быть мощным и изящным; а JavaScript-механизм с открытым исходным кодом V8 от Google показал, что он может быть невероятно быстрым. В настоящее время JavaScript становится серьезным языком программирования серверной стороны. Он служит языком хранения и запросов данных для нескольких не реляционных баз данных, включая Couch DB и Mongo, и используется в качестве универсального языка в серверных платформах, таких как Node.js.

Платформа Node.js существует с 2009 года, и она очень быстро завоевала широкое признание. С точки зрения архитектуры она подобна Sinatra тем, что не применяет подход MVC. Скорее она представляет собой способ связывания HTTP-запросов с кодом. В ней применены следующие основные новшества.

Использование JavaScript. Разработчикам нужно иметь дело только с единственным языком - в клиентском коде, внутри логики серверной стороны, в логике запроса данных через Couch DB [1, c. 55].

API - интерфейс Node.js не предоставляет никакого способа блокировки потока во время ожидания ввода - вывода или любой другой операции. Весь ввод-вывод реализуется за счет старта операции, а затем позднее приема обратного вызова после завершения ввода-вывода. Это означает, что Node.js чрезвычайно эффективно использует системные ресурсы и может обрабатывать десятки тысяч одновременных запросов на один ЦП (как правило, возможности альтернативных платформ ограничиваются приблизительно 100 одновременными запросами на один ЦП).

Как и Sinatra, Node.js - технология для определенного круга пользователей. Большинство компаний, создающих реальные приложения в ограниченные временные сроки, остро нуждается во всей инфраструктуре полномасштабных платформ, таких как Ruby on Rails и ASP.NET MVC. Node.js упоминается здесь только для того, чтобы часть проектного решения ASP.NET MVC можно было рассмотреть в контексте отраслевых тенденций. Например, ASP.NET MVC включает в себя асинхронные контроллеры. Это служит способом обработки запросов HTTP с применением неблокирующего ввода-вывода и масштабирования для обработки большего количества запросов на один ЦП [3, c. 824].

1.3 Обоснование выбора средств разработки приложения

Для разработки программного продукта была выбрана технология ASP.NET MVC 3 и язык C#, являющийся самым популярным языком для написания бизнес логики на платформе.NET, основные преимущества технологии ASP.NET MVC 3:

- Использование встроенного архитектурного шаблона MVC.

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

- Жесткий контроль над HTML и HTTP. В платформе ASP.NET MVC учтена важность генерации ясного и соответствующего стандартам кода разметки. Ее встроенные вспомогательные методы HTML создают соответствующий стандартам вывод, но в ней реализовано и гораздо более значимое философское изменение по сравнению с Web Forms. Вместо громадного объема трудно поддающегося управлению HTML-кода, платформа MVC стимулирует создание простых и элегантных, стилизованных с помощью CSS компонентов.

- Тестируемость. Естественное разнесение различных задач приложения по разным, независимым друг от друга частям программного обеспечения, поддерживаемое архитектурой MVC. позволяет изначально строить легко сопровождаемые и тестируемые приложения. Однако проектировщики ASP.NET MVC на этом не остановились. Для каждого фрагмента компонентно-ориентированного дизайна платформы они обеспечили структурированность, необходимую для выполнения требований модульного тестирования и средств макетирования.

В качестве IDE была выбрана Visual Studio 2010 - это интегрированная среда разработки Microsoft (IDE), являющейся самой функциональной IDE для разработки на платформе.NET.

Для модульного тестирования была выбрана встроенная поддержка в Visual Studio 2010 так как в настоящий момент функциональность встроенной поддержки ничуть не хуже чем у конкурентов, а тесная интеграция с IDE ставит её на первое место.

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

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

Для хранения данных был выбрана СУБД SQL Server 2008 и ORM Entitty Framework от Microsoft. Так как оба продукта от Microsoft у них есть наиболее тесная интеграция с другими продуктами.

1.4 Постановка задачи

Написать программный продукт «Интернет-магазин» при этом учесть позиции двух сторон: покупателя и продавца.

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

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

При этом нужно обеспечить понятный интерфейс приложения, доступный любому человеку.

Для достижения этих целей были выделены следующие этапы:

- формулировка задач и требований к системе;

- исследование предметной области (анализ данных и процессов)

- построение функциональной модели работы системы;

- разработка информационно-логической модели базы данных;

- построение логической и физической модели базы данных;

- разработка программы;

- тестирование программы.

2. Практический раздел

2.1 Разработка логической и физической модели базы данных

Для реализации базы данных интернет - магазина была спроектирована логическая (рисунок 2.1) а затем физическая (рисунок 2.2) модели базы данных.

Таблица 2.1 - Назначение сущностей

Название сущности

Назначение

Product

Хранение товаров

Order

Хранение заказов

ProductCategory

Хранение категорий товаров

Customer

Хранение информации об клиенте, осуществляющим заказ

CustomerOrder

Хранение связи между клиентом и заказов

Address

Хранение адреса клиента

AddressType

Хранение типа адреса

Shipment

Хранение связи между заказом, адресом и товаром

Рисунок 2.1 - Логическая модель базы данных

2.2 Проектирование структурной схемы информационно справочной системы

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

Рисунок 2.3 - Диаграмма прецедентов работы магазина

На рисунке 2.4 представлена диаграмма прецедентов, отображающая процессы, связанные с работой магазина с использованием интернет-магазина.

Рисунок 2.4-Диаграмма прецедентов работы интернет-магазина

На рисунке 2.5 представлена диаграмма действий с двумя актерами, отображающая процесс работы магазина до внедрения интернет-магазина.

Рисунок 2.5 - Диаграмма действий работы магазина до внедрения интернет-магазина

На рисунке 2.6 представлена диаграмма действий с двумя актерами, отображающая процесс работы магазина после внедрения интернет-магазина.

Рисунок 2.6 - Диаграмма действий работы магазина при внедрении интернет-магазина

На рисунке 2.7 представлена диаграмма с двумя актерами, отображающая последовательность процесса работы магазина до внедрения интернет-магазина.

Рисунок 2.7 - Диаграмма последовательности работы магазина

На рисунке 2.8 представлена диаграмма, отображающая последовательность процесса работы магазина после внедрения интернет-магазина.

Рисунок 2.8 - Диаграмма последовательности работы интернет - магазина

Схема классов проекта представлена на рисунке 2.9, бизнес-логика приложениянаходится в приложении A, разметка страниц в приложении Б.

3. Руководство пользователя

программный пользователь интернет база

В данном разделе описывается каким образом функционирует разработанная система с двух позиций: с позиции пользователя и с позиции администратора контента интернет-магазина. Первым делом рассмотрим систему с позиции администратора. Для того что бы администратору войти в систему администрирования нужно перейти на страницу авторизации, для этого нужно набрать необходимый адрес в браузере и ввести логин и пароль и нажать кнопку войти (Log in).

После того как администратор авторизовался он попадает в управление товарами, которые сейчас есть в магазине. Для добавления товара необходимо перейти по ссылке добавить новый товар (Add a new product). Для редактирования товара нужно нажать на товар а для сохранения изменений нажать кнопку сохранить (Save). Для удаления товара необходимо нажать кнопку удалить на против товара и товар будет удалён.

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

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

После того как пользователь совершил покупку на электронный ящик администратора интернет-магазина приходит письмо с полной информацией о заказе.

4. Тестирование программного продукта

При разработке программного продукта применялось модульное тестирование. Сначала писался тест, а потом писалась бизнес-логика которая позволила бы этот тест успешно выполнить, то есть разработка программного продукта велась через тестирование.

Рассмотрим модульные тесты для корзины покупок. Неверно функционирующая корзина нарушит работу всего приложения. Мы должны протестировать каждое средство по отдельности. Первое поведение относится к добавлению элемента в корзину. При самом первом добавлении в корзину объекта Product должен быть добавлен новый экземпляр CartLine. Ниже показан тестовый метод.

[TestMethod]

public void Can_Add NewLines() {

// Организация - создание нескольких тестовых товаров

Product pi = new Product (ProductID = I, Name = «PI»);

Product p2 = new Product {ProductID = 2, Name = «p2»};

// Организация - создание новой корзины

Cart target = new Cart();

// Действие

target. Addltem (pi, 1);

target. Addltem (p2, 1);

CartLine[] results = target. Lines. ToArray();

// Утверждение

Assert. AreEqual (results. Length, 2);

Assert. AreEqual (results[0].Product, pi);

Assert. AreEqual (results[1].Product, p2);

}

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

[TestMethod]

public void Can_Add_Quantity_For_Existing_Lines() (

// Организация - создание нескольких тестовых товаров

Product pi = new Product {ProductID = 1, Name = «PI»};

Product p2 = new Product {ProductID = 2, Name = «P2»};

// Организация - создание новой корзины

Cart target = new Cart();

// Действие

target. Addltem (pi, 1); target. Addltem (p2, 1); target. Addltem (pi, 10);

CartLine[] results = target. Lines. OrderBy (с => с. Product. ProductID).ToArray(); // Утверждение

Assert. AreEqual (results. Length, 2);

Assert. AreEqual (results[0].Quantity, 11);

Assert. AreEqual (results[1].Quantity, 1);

)

Мы также должны проверить, что пользователи имеют возможность менять свое решение и удалять товары из корзины. Это средство реализовано в виде метода RemoveLine. Ниже приведен тестовый метод.

[TestMethod]

public void Can_Remove_Line () {

// Организация - создание нескольких тестовых товаров

Product pi = new Product {ProductID = 1, Name = «PI»};

Product p2 = new Product {ProductID = 2, Name = «P2»};

Product p3 = new Product {ProductID = 3, Name = «P3»};

// Организация - создание новой корзины

Cart target = new Cart();

// Организация - добавление некоторых товаров в корзину

target. Addltem (pi, 1);

target. Addltem (р2, 3);

target. Addltem (рЗ, 5);

target. Addltem (p2, 1);

// Действие

target. RemoveLine(p2);

// Утверждение

Assert. AreEqual (target. Lines. Where (с => с. Product == p2).Count(), 0); Assert. AreEqual (target. Lines. Count(), 2);

}

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

[TestMethod]

public void Calculate Cart Total () (

// Организация - создание нескольких тестовых товаров

Product pi = new Product {ProductID = 1, Name = «PI», Price = 100M};

Product p2 = new Product {ProductID = 2, Name = «P2», Price = 50M};

// Организация - создание новой корзины

Cart target = new Cart();

// Действие

target. Addltem (pl, 1); target. Addltem (p2, 1); target. Addltem (pl, 3);

decimal result = target. ComputeTotalValue();

// Утверждение

Assert. AreEqual (result, 450M);

}

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

[TestMethod]

public void Can_Clear_Contents () {

// Организация - создание нескольких тестовых товаров

Product pl = new Product (ProductID = 1, Name = «Pl», Price = 100M);

Product p2 = new Product {ProductID = 2, Name = «P2», Price = 50M};

// Организация - создание новой корзины

Cart target = new Cart();

// Организация - добавление нескольких элементов

target. Addltem (pl, 1); target. Addltem (p2, 1);

// Действие - сброс корзины

target. Clear ();

// Утверждение

Assert. AreEqual (target. Lines. Count(), 0);

}

Иногда, как в этом случае, код для тестирования функциональности типа оказывается намного длиннее и сложнее, чем собственно тип.

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

Рисунок 4.1 - Результаты модульных тестов

Заключение

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

В ходе выполнения работы была изучена технология ASP.NET MVC 3, усовершенствованы навыки Web - разработки, работы с ORM Entity Framework, а так же были приобретены навыки разработки программного обеспечения через тестирование, для управления разработкой использовалась централизованная система контроля версий SVN и клиент для неё Tortoise SVN.

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

Список использованных источников

1. Фримен, A. ASP.NET МVС 3 для профессионалов /А. Фримен, С. Сандерсон. - Москва: Вильямс, 2012. - 680 с.: ил.

2. Троелсен, Э. Язык программирования C# 5.0 и платформа.NET 4.5 /Э. Троелсен - Москва: Вильямс, 2013-1312 с.: ил.

3. Либерти, Д. Программирование на C# /Д. Либерти. - СПб.: Питер, 2009. - 688 с.:ил.

4. Микелсен, К. Язык программирования C# /К. Микелсен. - ДиаСофт, 2002. - 656 с.:ил.

5. Информационные системы и технологии. Методические указания по выполнению дипломного проекта для студентов специальностей 1-40 01 02 «Информационные системы и технологии» / сост.: О.И. Наранович. - Барановичи: РИО БарГУ, 2009. - 39 с.

6. Петзольд, Ч. Программирование для Microsoft Windows на С# /Ч. Петзольд. - М.: Русская редакция, 2010. - 880 с.:ил.

7. Рихтер, Д. Программирование на платформе Microsoft.NET Framework / Д. Рихтер. - СПб.: Русская редакция, 2012. - 836 с.:ил.

8. Оформление раздела «Охрана труда» в дипломных проектах: методические указания по выполнению дипломных работ и проектов для студентов специальности 1-27 01 01 Экономика и организация производства; 1-40 01 02 Информационные системы и технологии / сост. Ю.И. Шадид. - Барановичи: РИО БарГУ, 2009. - 12 с.

9. Троелсен, Э. Язык программирования C# 4.0 и платформа.NET 4.0 /Э. Троелсен - Москва: Вильямс, 2011-1214 с.: ил.

10. Фримен, A. ASP.NET МVС 2 для профессионалов /А. Фримен, С. Сандерсон. - Москва: Вильямс, 2011. - 663 с.: ил.

11. Шилдт, Г. Полный справочник по C# 4.0 / Г. Шилдт - Москва: Вильямс, - 712 с.: ил.

12. Гросс, К. C# 2008. Самоучитель / К. Гросс. - СПб.: БХВ-Петербург, 2009. - 576 с.: ил

13. Грейди, Б. Язык UML. Руководство пользователя / Б. Грейди - 2-е изд. - М., СПб.: ДМК Пресс, 2004. - 432 с.

14. Головачев, А.С. Экономика предприятия / А.С. Головачев. - СПб.: БХВ-Петербург, 2009. - 576 с.: ил.

15. Зиборов, В.В. Visual C# 2008 на примерах / В.В. Зиборов. - СПб.: БХВ-Петербург, 2011. - 432 с.: ил.

16. Рихтер, Д. Программирование на платформе Microsoft.NET Framework / Д. Рихтер. - СПб.: Русская редакция, 2010. - 756 с.:ил.

17. Петзольд, Ч. Программирование для Microsoft Windows на С# /Ч. Петзольд. - М.: Русская редакция, 2012. - 880 с.:ил.

18. Стражева, В.И. Анализ хозяйственной деятельности в промышленности/ В.И. Стражева. - Мн.:Вышэйш. шк., 2005. - 397 с.

Приложение A

Код бизнес логики приложения

using System. ComponentModel. DataAnnotations;

using System. Web. Mvc;

namespace SportsStore. Domain. Entities {

public class Cart {

private List<CartLine> lineCollection = new List<CartLine>();

public void AddItem (Product product, int quantity) {

CartLine line = lineCollection

Where (p => p. Product. ProductID == product. ProductID)

FirstOrDefault();

if (line == null) {

lineCollection. Add (new CartLine {Product = product, Quantity = quantity});

} else {

line. Quantity += quantity;

}

}

public void RemoveLine (Product product) {

lineCollection. RemoveAll (l => l. Product. ProductID == product. ProductID);

}

public decimal ComputeTotalValue() {

return lineCollection. Sum (e => e. Product. Price * e. Quantity);

}

public void Clear() {

lineCollection. Clear();

}

public IEnumerable<CartLine> Lines {

get {return lineCollection;}

}

}

public class CartLine {

public Product Product {get; set;}

public int Quantity {get; set;}

}

public class Product {

[HiddenInput (DisplayValue=false)]

public int ProductID {get; set;}

[Required (ErrorMessage = «Please enter a product name»)]

public string Name {get; set;}

[Required (ErrorMessage = «Please enter a description»)]

[DataType (DataType. MultilineText)]

public string Description {get; set;}

[Required]

[Range (0.01, double. MaxValue, ErrorMessage = «Please enter a positive price»)]

public decimal Price {get; set;}

[Required (ErrorMessage = «Please specify a category»)]

public string Category {get; set;}

public byte[] ImageData {get; set;}

[HiddenInput (DisplayValue = false)]

public string ImageMimeType {get; set;}

}

public class ShippingDetails {

[Required (ErrorMessage = «Please enter a name»)]

public string Name {get; set;}

[Required (ErrorMessage = «Please enter the first address line»)]

public string Line1 {get; set;}

public string Line2 {get; set;}

public string Line3 {get; set;}

[Required (ErrorMessage = «Please enter a city name»)]

public string City {get; set;}

[Required (ErrorMessage = «Please enter a state name»)]

public string State {get; set;}

public string Zip {get; set;}

[Required (ErrorMessage = «Please enter a country name»)]

public string Country {get; set;}

public bool GiftWrap {get; set;}

}

}

using System. Linq;

using SportsStore. Domain. Entities;

namespace SportsStore. Domain. Abstract {

public interface IProductRepository {

IQueryable<Product> Products {get;}

void SaveProduct (Product product);

void DeleteProduct (Product product);

}

public interface IOrderProcessor {

void ProcessOrder (Cart cart, ShippingDetails shippingDetails);

}

}

using System. Linq;

using SportsStore. Domain. Abstract;

using SportsStore. Domain. Entities;

using System. Data. Entity;

using System. Net;

namespace SportsStore. Domain. Concrete {

public class EFProductRepository: IProductRepository {

private EFDbContext context = new EFDbContext();

public IQueryable<Product> Products {

get {return context. Products;}

}

public void SaveProduct (Product curproduct) {

if (curproduct. ProductID == 0)

{

context. Products. Add(curproduct);

}

else

{

Product product=context. Products. Where (p => p. ProductID == curproduct. ProductID).First();

product. Name = curproduct. Name;

product. Price = curproduct. Price;

product. ImageData = curproduct. ImageData;

product. ImageMimeType = curproduct. ImageMimeType;

product. Description = curproduct. Description;

product. Category = curproduct. Category;

}

context. SaveChanges();

}

public void EditProduct (Product product)

{

}

public void DeleteProduct (Product product) {

context. Products. Remove(product);

context. SaveChanges();

}

}

public class EFDbContext: DbContext {

public DbSet<Product> Products {get; set;}

}

public class EmailSettings {

public string MailToAddress = «ThisIsYourStore@yandex.ru»;

public string MailFromAddress = «ThisIsYourStore@yandex.ru»;

public bool UseSsl = true;

public string Username = «ThisIsYourStore»;

public string Password = «ThisIsYourStore1»;

public string ServerName = «smtp.yandex.com»;

public int ServerPort = 587;

public bool WriteAsFile = false;

}

public class EmailOrderProcessor:IOrderProcessor {

private EmailSettings emailSettings;

public EmailOrderProcessor (EmailSettings settings) {

emailSettings = settings;

}

public void ProcessOrder (Cart cart, ShippingDetails shippingInfo) {

using (var smtpClient = new SmtpClient()) {

smtpClient. EnableSsl = emailSettings. UseSsl;

smtpClient. Host = emailSettings. ServerName;

smtpClient. Port = emailSettings. ServerPort;

smtpClient. UseDefaultCredentials = false;

smtpClient. Credentials

= new NetworkCredential (emailSettings. Username, emailSettings. Password);

if (emailSettings. WriteAsFile) {

smtpClient. EnableSsl = false;

}

StringBuilder body = new StringBuilder()

AppendLine («A new order has been submitted»)

AppendLine(» -»)

AppendLine («Items:»);

foreach (var line in cart. Lines) {

var subtotal = line. Product. Price * line. Quantity;

body. AppendFormat(«{0} x {1} (subtotal: {2:c}», line. Quantity,

line. Product. Name,

subtotal);

}

body. AppendFormat («Total order value: {0:c}», cart. ComputeTotalValue())

AppendLine(» -»)

AppendLine («Ship to:»)

AppendLine (shippingInfo. Name)

AppendLine (shippingInfo. Line1)

AppendLine (shippingInfo. Line2?? «»)

AppendLine (shippingInfo. Line3?? «»)

AppendLine (shippingInfo. City)

AppendLine (shippingInfo. State?? «»)

AppendLine (shippingInfo. Country)

AppendLine (shippingInfo. Zip)

AppendLine(» -»)

AppendFormat («Gift wrap: {0}», shippingInfo. GiftWrap? «Yes»: «No»);

MailMessage mailMessage = new MailMessage (

emailSettings. MailFromAddress, // From

emailSettings. MailToAddress, // To

«New order submitted!», // Subject

body. ToString()); // Body

if (emailSettings. WriteAsFile) {

mailMessage. BodyEncoding = Encoding.ASCII;

}

smtpClient. Send(mailMessage);

}

}

}

}

using System;

using System. Web. Mvc;

using SportsStore. Domain. Entities;

namespace SportsStore. WebUI. Binders {

public class CartModelBinder: IModelBinder {

private const string sessionKey = «Cart»;

public object BindModel (ControllerContext controllerContext,

ModelBindingContext bindingContext) {

// get the Cart from the session

Cart cart = (Cart) controllerContext. HttpContext. Session[sessionKey];

// create the Cart if there wasn't one in the session data

if (cart == null) {

cart = new Cart();

controllerContext. HttpContext. Session[sessionKey] = cart;

}

// return the cart

return cart;

}

}

}

using System. Web. Mvc;

using SportsStore. WebUI. Infrastructure. Abstract;

using SportsStore. WebUI. Models;

namespace SportsStore. WebUI. Controllers {

public class AccountController: Controller {

IAuthProvider authProvider;

public AccountController (IAuthProvider auth) {

authProvider = auth;

}

public ViewResult LogOn() {

return View();

}

[HttpPost]

public ActionResult LogOn (LogOnViewModel model, string returnUrl) {

if (ModelState. IsValid) {

if (authProvider. Authenticate (model. UserName, model. Password)) {

return Redirect (returnUrl?? Url. Action («Index», «Admin»));

} else {

ModelState. AddModelError («», «Incorrect username or password»);

return View();

}

} else {

return View();

}

}

}

}

using System. Web. Mvc;

using SportsStore. Domain. Abstract;

using SportsStore. Domain. Entities;

using System. Linq;

using System. Web;

namespace SportsStore. WebUI. Controllers {

[Authorize]

public class AdminController: Controller {

private IProductRepository repository;

public AdminController (IProductRepository repo) {

repository = repo;

}

public ViewResult Index() {

return View (repository. Products);

}

public ViewResult Create() {

return View («Edit», new Product());

}

public ViewResult Edit (int productId) {

Product product = repository. Products. FirstOrDefault (p => p. ProductID == productId);

return View(product);

}

[HttpPost]

public ActionResult Delete (int productId) {

Product prod = repository. Products. FirstOrDefault (p => p. ProductID == productId);

if (prod!= null) {

repository. DeleteProduct(prod);

TempData [«message»] = string. Format(«{0} was deleted», prod. Name);

}

return RedirectToAction («Index»);

}

[HttpPost]

public ActionResult Edit (Product product, HttpPostedFileBase image) {

if (ModelState. IsValid) {

if (image!= null) {

product. ImageMimeType = image. ContentType;

product. ImageData = new byte [image. ContentLength];

image. InputStream. Read (product. ImageData, 0, image. ContentLength);

}

// save the product

repository. SaveProduct(product);

// add a message to the viewbag

TempData [«message»] = string. Format(«{0} has been saved», product. Name);

// return the user to the list

return RedirectToAction («Index»);

} else {

// there is something wrong with the data values

return View(product);

}

}

}

}

using System. Linq;

using System. Web. Mvc;

using SportsStore. Domain. Abstract;

using SportsStore. Domain. Entities;

using SportsStore. WebUI. Models;

namespace SportsStore. WebUI. Controllers {

public class CartController: Controller {

private IProductRepository repository;

private IOrderProcessor orderProcessor;

public CartController (IProductRepository repo, IOrderProcessor proc) {

repository = repo;

orderProcessor = proc;

}

[HttpPost]

public ViewResult Checkout (Cart cart, ShippingDetails shippingDetails) {

if (cart. Lines. Count() == 0) {

ModelState. AddModelError («Cart», «Sorry, your cart is empty!»);

}

if (ModelState. IsValid) {

orderProcessor. ProcessOrder (cart, shippingDetails);

cart. Clear();

return View («Completed»);

} else {

return View(shippingDetails);

}

}

public ViewResult Checkout() {

return View (new ShippingDetails());

}

public ViewResult Summary (Cart cart) {

return View(cart);

}

public RedirectToRouteResult AddToCart (Cart cart, int productId, string returnUrl) {

Product product = repository. Products

FirstOrDefault (p => p. ProductID == productId);

if (product!= null) {

cart. AddItem (product, 1);

}

return RedirectToAction («Index», new {returnUrl});

}

public RedirectToRouteResult RemoveFromCart (Cart cart,

int productId, string returnUrl) {

Product product = repository. Products

FirstOrDefault (p => p. ProductID == productId);

if (product!= null) {

cart. RemoveLine(product);

}

return RedirectToAction («Index», new {returnUrl});

}

public ViewResult Index (Cart cart, string returnUrl) {

return View (new CartIndexViewModel {

Cart = cart,

ReturnUrl = returnUrl

});

}

}

}

using System. Collections. Generic;

using System. Linq;

using System. Web. Mvc;

using SportsStore. Domain. Abstract;

using SportsStore. WebUI. Models;

namespace SportsStore. WebUI. Controllers {

public class NavController: Controller {

private IProductRepository repository;

public NavController (IProductRepository repo) {

repository = repo;

}

public ViewResult Menu (string category = null) {

ViewBag. SelectedCategory = category;

IEnumerable<string> categories = repository. Products

Select (x => x. Category)

Distinct()

OrderBy (x => x);

return View(categories);

}

}

}

using System. Linq;

using System. Web. Mvc;

using SportsStore. Domain. Abstract;

using SportsStore. WebUI. Models;

using SportsStore. Domain. Entities;

namespace SportsStore. WebUI. Controllers {

public class ProductController: Controller {

public int PageSize = 4; // We will change this later

private IProductRepository repository;

public ProductController (IProductRepository repoParam) {

repository = repoParam;

}

public ViewResult Searsh (string category, string query, int page=1)

{

ProductsListViewModel viewModel = new ProductsListViewModel

{

Products = repository. Products

Where (p => (category == null? true: p. Category == category)&&(p. Description. IndexOf(query)!=-1||p. Name. IndexOf(query)!=-1))

OrderBy (p => p. ProductID)

Skip((page - 1) * PageSize)

Take(PageSize),

PagingInfo = new PagingInfo

{

CurrentPage = page,

ItemsPerPage = PageSize,

TotalItems = category == null?

repository. Products. Count():

repository. Products. Where (e => e. Category == category).Count()

},

CurrentCategory = category

};

return View(viewModel);

}

public ViewResult List (string category, int page = 1) {

ProductsListViewModel viewModel = new ProductsListViewModel {

Products = repository. Products

Where (p => category == null? true: p. Category == category)

OrderBy (p => p. ProductID)

Skip((page - 1) * PageSize)

Take(PageSize),

PagingInfo = new PagingInfo {

CurrentPage = page,

ItemsPerPage = PageSize,

TotalItems = category == null?

repository. Products. Count():

repository. Products. Where (e => e. Category == category).Count()

},

CurrentCategory = category

};

return View(viewModel);

}

public FileContentResult GetImage (int productId) {

Product prod = repository. Products. FirstOrDefault (p => p. ProductID == productId);

if (prod!= null) {

return File (prod. ImageData, prod. ImageMimeType);

} else {

return null;

}

}

}

}

using System;

using System. Text;

using System. Web. Mvc;

using SportsStore. WebUI. Models;

namespace SportsStore. WebUI. HtmlHelpers {

public static class PagingHelpers {

public static MvcHtmlString PageLinks (this HtmlHelper html,

PagingInfo pagingInfo,

Func<int, string> pageUrl) {

StringBuilder result = new StringBuilder();

for (int i = 1; i <= pagingInfo. TotalPages; i++) {

TagBuilder tag = new TagBuilder («a»); // Construct an <a> tag

tag. MergeAttribute («href», pageUrl(i));

tag. InnerHtml = i. ToString();

if (i == pagingInfo. CurrentPage)

tag. AddCssClass («selected»);

result. Append (tag. ToString());

}

return MvcHtmlString. Create (result. ToString());

}

}

}

namespace SportsStore. WebUI. Infrastructure. Abstract {

public interface IAuthProvider {

bool Authenticate (string username, string password);

}

}

using System. Web. Security;

using SportsStore. WebUI. Infrastructure. Abstract;

namespace SportsStore. WebUI. Infrastructure. Concrete {

public class FormsAuthProvider: IAuthProvider {

public bool Authenticate (string username, string password) {

bool result = FormsAuthentication. Authenticate (username, password);

if (result) {

FormsAuthentication. SetAuthCookie (username, false);

}

return result;

}

}

}

using System;

using System. Configuration;

using System. Web. Mvc;

using System. Web. Routing;

using Ninject;

using SportsStore. Domain. Abstract;

using SportsStore. Domain. Concrete;

using SportsStore. WebUI. Infrastructure. Abstract;

using SportsStore. WebUI. Infrastructure. Concrete;

namespace SportsStore. WebUI. Infrastructure {

public class NinjectControllerFactory: DefaultControllerFactory {

private IKernel ninjectKernel;

public NinjectControllerFactory() {

ninjectKernel = new StandardKernel();

AddBindings();

}

protected override IController GetControllerInstance (RequestContext requestContext,

Type controllerType) {

return controllerType == null

? null

: (IController) ninjectKernel. Get(controllerType);

}

private void AddBindings() {

// put additional bindings here

ninjectKernel. Bind<IProductRepository>().To<EFProductRepository>();

// create the email settings object

EmailSettings emailSettings = new EmailSettings {

WriteAsFile

= bool. Parse (ConfigurationManager. AppSettings [«Email. WriteAsFile»]?? «false»)

};

ninjectKernel. Bind<IOrderProcessor>()

To<EmailOrderProcessor>().WithConstructorArgument («settings», emailSettings);

ninjectKernel. Bind<IAuthProvider>().To<FormsAuthProvider>();

}

}

}

using SportsStore. Domain. Entities;

namespace SportsStore. WebUI. Models {

public class CartIndexViewModel {

public Cart Cart {get; set;}

public string ReturnUrl {get; set;}

}

}

using System. ComponentModel. DataAnnotations;

namespace SportsStore. WebUI. Models {

public class LogOnViewModel {

[Required]

public string UserName {get; set;}

[Required]

[DataType (DataType. Password)]

public string Password {get; set;}

}

}

using System;

namespace SportsStore. WebUI. Models {

public class PagingInfo {

public int TotalItems {get; set;}

public int ItemsPerPage {get; set;}

public int CurrentPage {get; set;}

public int TotalPages {

get {return (int) Math. Ceiling((decimal) TotalItems / ItemsPerPage);}


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

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

    курсовая работа [3,6 M], добавлен 25.06.2012

  • Принципы построения СУБД, их достоинства. Архитектура распределенной информационной системы. Разработка интернет-магазина рынка книг: построение физической модели данных на языке SQL, проектирование схемы базы данных с использованием веб-интерфейса.

    курсовая работа [2,3 M], добавлен 01.11.2011

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

    дипломная работа [1,7 M], добавлен 08.06.2013

  • Проектирование книжного интернет-магазина для реализации книжной продукции через Интернет. Анализ и обоснование выбора языков программирования и средств разработки сайта. Затраты внедрение сайта, его программное обеспечение, тестирование и отладка.

    дипломная работа [2,1 M], добавлен 06.06.2013

  • Разработка тематических "онлайн-магазинов". Обоснование выбора информационных технологий. Архитектурное решение проекта. Разработка модели базы данных магазина. Схема базы данных на языке SQL. Интернет-магазины "ebay.com", "onliner.by", "eda.by".

    курсовая работа [1,1 M], добавлен 24.06.2013

  • Характеристика основных программных средств построения электронного магазина. Разработка структуры построения электронного магазина. Безопасность платежей в Интернете. Разработка алгоритма работы интернет-магазина. Разработка системы оплаты и доставки.

    дипломная работа [1,9 M], добавлен 10.03.2014

  • Обзор принципов построения информационных систем для торговли через интернет. Сравнительная характеристика программных средств построения электронного магазина. Проектирование и программная реализация интернет–магазина. Экономическое обоснование проекта.

    дипломная работа [2,5 M], добавлен 13.02.2006

  • Анализ объектно-ориентированной технологии программирования на примере языка Java. Методы, инструменты разработки web-приложений. Применение их при создании Интернет-магазина для ООО "Компас". Разработка апплета для его страницы в виде стрелочных часов.

    курсовая работа [2,7 M], добавлен 31.01.2014

  • Знакомство с организационно-функциональной структурой и хозяйственной деятельностью предприятия. Сравнительный анализ интернет-магазинов. Формирование требований к интернет-магазину. Обоснование экономической эффективности разработки интернет-магазина.

    курсовая работа [1,4 M], добавлен 15.04.2012

  • Проектирование даталогической модели в виде логической структуры реляционной базы данных в СУБД Microsoft SQL Server на основе созданной инфологической модели базы данных интернет-магазина музыки. Выделение сущностей и связей, анализ предметной области.

    курсовая работа [724,6 K], добавлен 15.06.2013

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