Проектирование и разработка веб-приложения на основе технологий Symfony Framework

История развития веб-технологий и существующие проблемы. Назначение и установка Symfony Framework. Создание приложения на основе технологий Symfony Framework. Установка дополнительных библиотек через composer, верстка шаблона, настройка сервисов.

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

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

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

$rate += $newReview->getRate();

++$count;

}

$rate = round($rate / $count, 1);

$this->setRate($rate);

return $this;

}

publicfunctionremoveReview(Review $review)

{

$this->reviews->removeElement($review);

return $this;

}

publicfunctiongetRate()

{

return $this->rate;

}

publicfunctionsetRate(float $rate)

{

$this->rate = $rate;

return $this;

}

publicfunctiongetIntRate()

{

return (int) $this->getRate();

}

publicfunctionsetMultiplayer(bool $multiplayer)

{

$this->multiplayer = $multiplayer;

return $this;

}

publicfunctiongetMultiplayer()

{

return $this->multiplayer;

}

publicfunctiongetDiscount()

{

return $this->discount;

}

publicfunctionsetDiscount($discount)

{

$this->discount = $discount;

return $this;

}

publicfunctionremoveDiscount()

{

$this->discount = null;

return $this;

}

publicfunctiongetDiscountPrice()

{

if ($this->getDiscount()) {

$discountPrice = $this->getPrice() - $this->discount->getValue() * $this->getPrice() / 100;

} else {

$discountPrice = $this->getPrice();

}

return (int) $discountPrice;

}

publicfunctiongetIsDiscount()

{

return $this->getDiscountPrice() != $this->getPrice();

}

publicfunctiongetBasketProducts()

{

return $this->basketProducts;

}

publicfunctiongetBuyCount()

{

return $this->buyCount;

}

publicfunctionsetBuyCount($buyCount)

{

$this->buyCount = $buyCount;

return $this;

}

publicfunctiongetLastBuy()

{

return $this->lastBuy;

}

publicfunctionsetLastBuy(\DateTime $lastBuy)

{

$this->lastBuy = $lastBuy;

return $this;

}

publicfunctiongetIsReleased()

{

return $this->isReleased;

}

publicfunctionsetIsReleased(bool $isReleased)

{

$this->isReleased = $isReleased;

return $this;

}

publicfunctiongetIsFavorite(User $user = null)

{

if ($user == null) {

returnfalse;

}

$favorites = $user->getFavoriteGames();

foreach ($favorites as $favorite) {

if ($favorite->getId() == $this->getId()) {

returntrue;

}

}

returnfalse;

}

publicfunctiongetReviewCount()

{

return $this->reviews->count();

}

publicfunctiongetIsRus()

{

return $this->isRus;

}

publicfunctionsetIsRus(bool $isRus)

{

$this->isRus = $isRus;

return $this;

}

publicfunctiongetKeysCount()

{

return $this->getKeys()->count();

}

}

Листинг 21. КласссущностиGame

Приложение C. РепозиторийGameRepositoryсущностиGame

<?

namespace Difuks\DazzleBundle\Repository;

use Doctrine\ORM\EntityRepository;

use Doctrine\ORM\Query\Expr\Join;

classGameRepositoryextends EntityRepository

{

publicfunctioncount(): int

{

$db = $this->createQueryBuilder('t');

return $db

->select('count(t.id)')

->getQuery()

->getSingleScalarResult();

}

publicfunctionmaxPrice()

{

$db = $this->createQueryBuilder('t');

return $db

->select('MAX(t.price)')

->getQuery()

->getSingleScalarResult();

}

publicfunctionminPrice()

{

$minPrice = $this->getEntityManager()

->createQuery(

'SELECT

round(MIN(CASE WHEN g.discount IS NULL THEN g.price ELSE (g.price - g.price * d.value / 100) END),1)

FROM DifuksDazzleBundle:Game g

LEFT JOIN DifuksDazzleBundle:Discount d

WHERE g.discount = d'

)

->getSingleScalarResult();

return $minPrice;

}

publicfunctionmaxAgeRest()

{

$db = $this->createQueryBuilder('t');

return $db

->select('MAX(t.ageRestrictions)')

->getQuery()

->getSingleScalarResult();

}

publicfunctionminAgeRest()

{

$db = $this->createQueryBuilder('t');

return $db

->select('MIN(t.ageRestrictions)')

->getQuery()

->getSingleScalarResult();

}

publicfunctionfindByFilter(array $filter = [], array $sort = [], int $page = 1, $count = 9)

{

$query = $this->createQueryBuilder('g');

$actualPrice = 'CASE WHEN g.discount IS NULL THEN g.price ELSE (g.price - g.price * d.value / 100) END';

$query->select("g, $actualPrice AS HIDDEN price");

$query

->leftJoin('DifuksDazzleBundle:Discount', 'd', Join::WITH, 'g.discount = d');

if (isset($filter['price']['min'])) {

$minPrice = $filter['price']['min'];

$query->andWhere("$actualPrice>= $minPrice");

}

if (isset($filter['price']['max'])) {

$maxPrice = $filter['price']['max'];

$query->andWhere("$actualPrice<= $maxPrice");

}

if (isset($filter['age']['min'])) {

$ageMin = $filter['age']['min'];

$query->andWhere("g.ageRestrictions >= $ageMin");

}

if (isset($filter['age']['max'])) {

$ageMax = $filter['age']['max'];

$query->andWhere("g.ageRestrictions <= $ageMax");

}

if (isset($filter['rate']['min'])) {

$rateMin = $filter['rate']['min'];

$query->andWhere("g.rate >= $rateMin");

}

if (isset($filter['rate']['max'])) {

$rateMax = $filter['rate']['max'];

$query->andWhere("g.rate <= $rateMax");

}

if (isset($filter['isReleased'])) {

$query->andWhere('g.isReleased = TRUE');

}

if (isset($filter['isDiscount'])) {

$query->andWhere('g.discount IS NOT NULL');

}

if (isset($filter['genre'])) {

$query->andWhere(':genres MEMBER OF g.genres');

$query->setParameter('genres', $filter['genre']);

}

$order = $sort['order'];

$by = $sort['by'];

if ($order == 'price') {

$query->addOrderBy('price', $by);

} else {

$query->addOrderBy("g.$order", $by);

}

$games = $query->getQuery()->setMaxResults($count * $page)->setFirstResult(($page - 1) * $count)->getResult();

$totalCount = count($query->select('g.id')->orderBy('g.id')->getQuery()->getResult());

return [

'elements' => $games,

'page' => [

'count' => ceil($totalCount / $count),

'current' => $page,

],

];

}

publicfunctiongetDisocuntGames()

{

$db = $this->createQueryBuilder('g');

$db->where('g.discount IS NOT NULL')->setFirstResult(0)->setMaxResults(10);

return $db->getQuery()->getResult();

}

}

Листинг 22. РепозиторийGameRepositoryсущности Game

Приложение D. Класс генерации формы на основе сущности

<?

namespace Difuks\DazzleBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

use Symfony\Component\Validator\Constraints as Assert;

/**

* Feedback.

*

* @ORM\Table(name="feedback")

* @ORM\Entity()

*/

classFeedback

{

/**

* @var int

*

* @ORM\Column(name="id", type="integer")

* @ORM\Id

* @ORM\GeneratedValue(strategy="AUTO")

*/

private $id;

/**

* @var string

*

* @Assert\NotBlank()

* @ORM\Column(name="name", type="string", length=255, nullable=false)

*/

private $name;

/**

* @var string

*

* @Assert\NotBlank()

* @Assert\Email()

* @ORM\Column(name="email", type="string", length=255, nullable=false)

*/

private $email;

/**

* @var string

*

* @Assert\NotBlank()

* @ORM\Column(name="text", type="text", length=255, nullable=false)

*/

private $text;

/**

* @var \DateTime

*

* @ORM\Column(name="date", type="datetime")

*/

private $date;

publicfunction__construct()

{

$this->date = new \DateTime();

}

publicfunctiongetId()

{

return $this->id;

}

publicfunctiongetName()

{

return $this->name;

}

publicfunctionsetName(string $name)

{

$this->name = $name;

}

publicfunctiongetEmail()

{

return $this->email;

}

publicfunctionsetEmail(string $email)

{

$this->email = $email;

}

publicfunctiongetText()

{

return $this->text;

}

publicfunctionsetText(string $text)

{

$this->text = $text;

}

publicfunctiongetDate()

{

return $this->date;

}

publicfunctionsetDate(\DateTime $date)

{

$this->date = $date;

}

}

Листинг 22. СущностьFeedback

<?

namespace Difuks\DazzleBundle\Form;

use Difuks\DazzleBundle\Entity\Feedback;

use Symfony\Component\Form\AbstractType;

use Symfony\Component\Form\Extension\Core\Type\EmailType;

use Symfony\Component\Form\Extension\Core\Type\TextType;

use Symfony\Component\Form\Extension\Core\Type\TextareaType;

use Symfony\Component\Form\FormBuilderInterface;

use Symfony\Component\OptionsResolver\OptionsResolver;

classFeedbackTypeextends AbstractType

{

publicfunctionbuildForm(FormBuilderInterface $builder, array $options)

{

$builder

->add('name', TextType::class, [

'label' =>'Имя',

'required' =>false,

'mapped' =>true,

])

->add('email', EmailType::class, [

'label' =>'Email',

'required' =>false,

])

->add('text', TextareaType::class, [

'label' =>'Текстобращения',

'required' =>false,

])

;

}

publicfunctionconfigureOptions(OptionsResolver $resolver)

{

$resolver->setDefaults([

'data_class' => Feedback::class,

]);

}

}

Листинг 23. Класс генерации формы обратной связи

Приложение E. Маршруты и контроллер публичной части сайта

index:

path: /

defaults: { _controller: DifuksDazzleBundle:Public:index }

genres:

path: /genres/

defaults: { _controller: DifuksDazzleBundle:Public:genres }

catalog_all:

path: /catalog/

defaults: { _controller: DifuksDazzleBundle:Public:catalog }

catalog:

path: /catalog/{code}

defaults: { _controller: DifuksDazzleBundle:Public:catalog }

product:

path: /product/{code}

defaults: { _controller: DifuksDazzleBundle:Public:product, code: default }

basket:

path: /basket/

defaults: { _controller: DifuksDazzleBundle:Public:basket }

feedback:

path: /feedback/

defaults: { _controller: DifuksDazzleBundle:Public:feedback }

unsubscribe:

path: /unsubscribe/{hash}

defaults: { _controller: DifuksDazzleBundle:Public:unsubscribe }

Листинг 24. Конфигурация маршрутов публичной части

<?

declare(strict_types=1);

namespace Difuks\DazzleBundle\Controller;

use Difuks\DazzleBundle\Entity\Feedback;

use Difuks\DazzleBundle\Entity\Game;

use Difuks\DazzleBundle\Entity\Genre;

use Difuks\DazzleBundle\Entity\Subscribes;

use Difuks\DazzleBundle\Form\FeedbackType;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Symfony\Component\HttpFoundation\Response;

classPublicControllerextends Controller

{

publicfunctionindexAction(): Response

{

return $this->render('DifuksDazzleBundle:Public:index.html.twig');

}

publicfunctiongenresAction(): Response

{

$genres = $this->getDoctrine()->getRepository(Genre::class)->findBy([], ['id' =>'ASC']);

$totalCount = $this->getDoctrine()->getRepository(Game::class)->count();

return $this->render('DifuksDazzleBundle:Public:genres.html.twig', ['genres' => $genres, 'totalCount' => $totalCount]);

}

publicfunctioncatalogAction(Genre $genre = null): Response

{

return $this->render('DifuksDazzleBundle:Public:catalog.html.twig', ['genre' => $genre]);

}

publicfunctionproductAction(Game $game): Response

{

return $this->render('DifuksDazzleBundle:Public:product.html.twig', ['game' => $game]);

}

publicfunctionbasketAction(): Response

{

return $this->render('@DifuksDazzle/Public/basket.html.twig');

}

publicfunctionfeedbackAction(): Response

{

$form = $this->createForm(FeedbackType::class);

return $this->render('@DifuksDazzle/Public/feedback.html.twig', ['form' => $form->createView()]);

}

publicfunctionunsubscribeAction(Subscribes $subscribe): Response

{

$this->get('difuks.dazzle.social_service')->unSubscribe($subscribe);

return $this->render('@DifuksDazzle/Public/unsubscribe.html.twig');

}

}

Листинг 25. Контроллер публичной части сайта

Приложение F. Сервис для работы с корзиной и заказами. Настройкасервисов

<?

namespace Difuks\DazzleBundle\Services;

use Difuks\DazzleBundle\Entity\Basket;

use Difuks\DazzleBundle\Entity\BasketProduct;

use Difuks\DazzleBundle\Entity\Game;

use Doctrine\ORM\EntityManager;

use Symfony\Component\DependencyInjection\Container;

classOrderService

{

protected $container;

protected $pass;

protected $pass2;

protected $login;

protected $em;

protected $mailer;

publicfunction__construct(Container $container, EntityManager $em, \Swift_Mailer $mailer)

{

$this->container = $container;

$this->mailer = $mailer;

$this->em = $em;

$this->login = $container->getParameter('robokassa.login');

$this->pass = $container->getParameter('robokassa.password');

$this->pass2 = $container->getParameter('robokassa.password2');

}

/**

* Получает url для перевода в систему оплаты.

*

* @param int $id id заказа

* @param float $sum сумма заказа

*

* @return string url

*/

publicfunctiongetUrl(int $id, float $sum): string

{

$descr = 'Оформление заказа №'.$id;

$crc = md5("$this->login:$sum:$id:$this->pass");

$url = "https://auth.robokassa.ru/Merchant/Index.aspx?MrchLogin=$this->login&".

"OutSum=$sum&InvId=$id&Description=$descr&SignatureValue=$crc&IsTest=1";

return $url;

}

/**

* Обрабатывает результат запроса от службы оплаты.

*

* @param int $id id заказа

* @param float $sum сумма заказа

* @param string $crc хэш

*

* @throws \Exception в случае несовпадения хэша

*/

publicfunctionsetResult(int $id, float $sum, string $crc): void

{

$crc = strtoupper($crc);

$myCrc = strtoupper(md5("$sum:$id:$this->pass2"));

if ($myCrc != $crc) {

thrownew \Exception('Неверныеданныеоплаты. Хеш '.$myCrc.' и '.$crc.' несовпадают');

}

$basket = $this->em->getRepository(Basket::class)->find($id);

$fromEmail = $this->container->getParameter('mailer_user');

if ($basket->getPaymentState() != 2) {

$this->sendEmailAboutPay($basket, $fromEmail);

$this->refreshGamesRate($basket);

$basket->setPaymentState(2);

$this->em->persist($basket);

$this->em->flush();

}

}

/**

* Отправляет email об успешной оплате.

*

* @param Basket $basket

* @param string $email

*/

protectedfunctionsendEmailAboutPay(Basket $basket, string $email): void

{

$body = [];

$keys = $basket->getKeys();

/*

* @var Key

*/

foreach ($keys as $key) {

$body[$key->getGame()->getName()][] = $key->getKey();

}

$message = \Swift_Message::newInstance()

->setSubject('Покупкаигр')

->setFrom($email)

->setTo($basket->getUser()->getEmail())

->setBody($this->container->get('templating')->render(

'@DifuksDazzle/Email/keys.send.html.twig',

['body' => $body]

),

'text/html');

$this->mailer->send($message);

}

/**

* Обновляет количество покупок игры, а так же дату последней покупки.

*

* @param Basket $basket

*/

protectedfunctionrefreshGamesRate(Basket $basket): void

{

$products = $basket->getProducts();

foreach ($products as $product) {

$game = $product->getGame();

$currentCount = ($game->getBuyCount()) ?: 0;

$game->setBuyCount($currentCount + $product->getQuantity());

$game->setLastBuy(new \DateTime());

$this->em->persist($game);

$this->em->flush();

}

}

/**

* Обрабатывает запрос на странице завершения оплаты.

*

* @param int $id id заказа

* @param float $sum сумма заказа

* @param string $crc хэш

*

* @throws \Exception в случае несовпадения хэша

*

* @return string текст с результатом

*/

publicfunctiongetDone(int $id, float $sum, string $crc): string

{

$crc = strtoupper($crc);

$myCrc = strtoupper(md5("$sum:$id:$this->pass"));

if ($myCrc != $crc) {

thrownew \Exception('Неверныеданныеоплаты. Хеш '.$myCrc.' и '.$crc.' несовпадают');

}

$basket = $this->em->getRepository(Basket::class)->find($id);

if (isset($basket)) {

if ($basket->getPaymentState() != 2) {

$basket->setPaymentState(1);

$this->em->persist($basket);

$this->em->flush();

}

return'Операция прошла успешно. После проведения оплаты ключи отправят вам на email. Спасибо за покупку!';

} else {

return'Нет заказа с таким номером';

}

}

/**

* Получает текущую корзину пользователя.

*

* @return Basket

*/

publicfunctiongetCurrentBasket(): Basket

{

$user = $this->container->get('security.token_storage')->getToken()->getUser();

$basket = $this->em->getRepository(Basket::class)->getCurrentBasketByUser($user);

return $basket;

}

/**

* Добавляет необходимое количество игр в корзину. Возвращает оставшееся количество ключей.

*

* @param Basket $basket

* @param Game $game

* @param int $quantity

*

* @return int

*/

publicfunctionaddToBasket(Basket $basket, Game $game, int $quantity): int

{

$basket->addGame($game, $quantity);

$this->em->persist($basket);

$this->em->flush();

return $game->getKeysCount();

}

/**

* Изменят количество находящейся в корзине игр

*

* @param BasketProduct $basketProduct

* @param int $quantity

*/

publicfunctionchangeBasketProductCount(BasketProduct $basketProduct, int $quantity): void

{

$basketProduct->getBasket()->changeGameCount($basketProduct->getGame(), $quantity);

$this->em->persist($basketProduct);

$this->em->flush();

}

/**

* Удаляетигруизкорзины.

*

* @param BasketProduct $basketProduct

*/

publicfunctiondeleteBasketProduct(BasketProduct $basketProduct): void

{

$basket = $basketProduct->getBasket();

$basket->removeProduct($basketProduct);

if ($basket->getProductCount() == 0) {

$this->em->remove($basket);

} else {

$this->em->persist($basket);

}

$this->em->flush();

}

/**

* Удаляет старые корзины.

*

* @param int $notPayDay количество дней для удаления корзин в статусе неоплачено

* @param int $payDay количество дней для удаления корзин в статусе ожидания оплаты

*

* @return int число удалённых корзин

*/

publicfunctionclearOldBasket(int $notPayDay, int $payDay): int

{

$oldBaskets = $this->em

->getRepository(Basket::class)

->getOldBaskets(

$notPayDay,

$payDay

);

$count = count($oldBaskets);

foreach ($oldBaskets as $basket) {

$this->em->remove($basket);

}

$this->em->flush();

return $count;

}

}

Листинг 26. Сервис для работы с корзиной и заказами

services:

difuks.dazzle.file.twig.extension:

class: Difuks\DazzleBundle\Extension\Twig\FileExtension

arguments: ['@service_container']

tags:

- { name: twig.extension }

difuks.dazzle.flush_handler:

class: Difuks\DazzleBundle\EventHandler\FlushHandler

arguments: ['@swiftmailer.mailer.cron', '@service_container']

tags:

- { name: doctrine.event_listener, event: onFlush }

difuks.dazzle.authentication_handler:

class: Difuks\DazzleBundle\EventHandler\AuthenticationHandler

arguments: ['@router', '@security.authorization_checker']

difuks.dazzle.order_service:

class: Difuks\DazzleBundle\Services\OrderService

arguments: ['@service_container', '@doctrine.orm.entity_manager', '@swiftmailer.mailer.moment']

difuks.dazzle.social_service:

class: Difuks\DazzleBundle\Services\SocialService

arguments: ['@service_container', '@doctrine.orm.entity_manager']

difuks.dazzle.form.registration:

class: Difuks\DazzleBundle\Form\RegistrationType

tags:

- { name: form.type, alias: difuks_dazzle_user_registration }

difuks.dazzle.form.profile:

class: Difuks\DazzleBundle\Form\ProfileType

tags:

- { name: form.type, alias: difuks_dazzle_user_profile }

Листинг 27. Файл настройки собственных сервисов

Приложение F. Класс консольной команды очистки заброшенных корзин

<?

declare(strict_types=1);

namespace Difuks\DazzleBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;

use Symfony\Component\Console\Input\InputInterface;

use Symfony\Component\Console\Input\InputOption;

use Symfony\Component\Console\Output\OutputInterface;

classClearOldBasketCommandextends ContainerAwareCommand

{

protectedfunctionconfigure()

{

$this->addOption('not-pay-day', null, InputOption::VALUE_REQUIRED, 'Количестводнейдляудалениекорзинсостатусом 0', 1);

$this->addOption('pay-day', null, InputOption::VALUE_REQUIRED, 'Количестводнейдляудалениекорзинсостатусом 1', 3);

$this

->setName('difuks:dazzle:basket:clear-old')

->setDescription('Очищает старые корзины')

->setHelp('Очищает корзины со статусом 0 (старее одного дня) и 1 (старее трёх дней)');

}

protectedfunctionexecute(InputInterface $input, OutputInterface $output)

{

$notPayDay = (int) $input->getOption('not-pay-day');

$payDay = (int) $input->getOption('pay-day');

$count = $this->getContainer()->get('difuks.dazzle.order_service')->clearOldBasket($notPayDay, $payDay);

$output->writeln((new \DateTime())->format('d.m.Y H:i:s')." Remove $count baskets");

}

}

Листинг 28. Класс консольной команды очистки заброшенных корзин

Приложение G. Функциональный тест виджета добавления в корзину и конфигурация PHPUnit

<?

namespace Difuks\DazzleBundle\Tests\Functional\Controller;

use Difuks\DazzleBundle\Tests\Functional\BaseControllerTest;

classWidgetControllerTestextends BaseControllerTest

{

publicfunctiontestProductSliderWidget()

{

$crawler = $this->client->request('GET', '/');

$gameButtons = $crawler->filter('button:contains("Вкорзину")');

$this->assertTrue($gameButtons->count() >0, 'Ни одной доступной для покупки игры');

if ($gameButtons->count()) {

$this->checkUrl('/ajax/add-to-basket/'.$gameButtons->first()->attr('data-id'));

$answer = json_decode($this->client->getResponse()->getContent(), true);

$this->assertTrue(isset($answer['error']) && $answer['error'] == true, 'Добавлениевкорзинудоступнонеавторизованномупользователю');

$this->logIn();

$this->checkUrl('/ajax/add-to-basket/'.$gameButtons->first()->attr('data-id'));

$this->logout();

}

}

}

Листинг 29. Функциональный тест виджета добавления в корзину

<?xml version="1.0" encoding="UTF-8"?>

<!-- https://phpunit.de/manual/current/en/appendixes.configuration.html -->

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd"

backupGlobals="false"

colors="true"

bootstrap="app/autoload.php"

>

<php>

<ini name="error_reporting" value="-1" />

<server name="KERNEL_DIR" value="app/" />

</php>

<testsuites>

<testsuite name="Project Test Suite">

<directory>src/Difuks/DazzleBundle/Tests/</directory>

</testsuite>

</testsuites>

<filter>

<whitelist>

<directory>src</directory>

<exclude>

<directory>src/*Bundle/Resources</directory>

<directory>src/*/*Bundle/Resources</directory>

<directory>src/*/Bundle/*Bundle/Resources</directory>

</exclude>

</whitelist>

</filter>

</phpunit>

Листинг 30. КонфигурационныйфайлPHPUnit

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


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

  • Обзор существующих технологий разработки программного обеспечения. Описание платформы NET Framework. Принцип работы платформы: компиляция исходного кода; процесс загрузки и исполнения кода; IL-код и верификация. Новые возможности платформы NET Framework.

    реферат [30,7 K], добавлен 01.03.2011

  • Разработка программного приложения по учету договоров с поставщиками и клиентами для строительного предприятия. Особенности использования технологии Net Framework 2.0 в алгоритмически-логическом аспекте на основе реляционной базы, управляемой языком SQL.

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

  • Изучение сведений o плaтфopме .NET Framework. Характеристика метoдов дocтупa к бaзaм дaнныx. Рaзpaбoтка пpилoжения "Пocтaвкa и pеaлизaция пpoгpaммнoгo oбеcпечения", coдеpжaщего бaзу дaнныx и pacкpывaющего вcе acпекты paзpaбoтки бaзы дaнныx нa языке C+.

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

  • Розробка гри "Арканоід", з можливістю гри, як одного та і двох гравців одночасно на одному гральному полі, за допомогою Visual Studio 2008 з XNA Framework. Аналіз предметної галузі. Опис концептуальної моделі. Реалізація взаємодії між гравцем та системою.

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

  • Общие сведения о платформе Microsoft NET Framework. Разработка приложения "Поставка и реализация программного обеспечения", содержащего базу данных о каталогах адресов в Internet. Описание логической структуры. Требования к техническому обеспечению.

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

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

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

  • Разработка программного решения по созданию мобильного приложения. Изучение технологий для разработки приложений. Анализ работы торговых агентов. Обоснование выбора языка программирования. Проектирование интерфейса структуры и верстка, листинг программы.

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

  • Описание платформы NET Framework. База данных Microsoft Access. Разработка Windows приложения. Модель программирования Windows Forms. Функциональное назначение программы. Входные и выходные данные. Требования к техническому и программному обеспечению.

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

  • Характеристика и состав Microsoft Solution Framework. Модель команды, её характеристики. Цели качества команды проекта. Модель процессов, её содержание. Принципы управления рисками. Утверждение целей и границ, плана проекта. Модель приложений MSF.

    презентация [752,5 K], добавлен 10.05.2013

  • История развития средств создания и демонстрации компьютерных презентаций. Краткий обзор программных средств: MS Power Point, Open Office Impress, iWork и некоторых online – сервисов. Проектирование и разработка презентации на основе собственного шаблона.

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

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